@JsonProperty在springboot升级后不工作



我最近将我的应用程序从Spring Boot 1.5.3升级到了Spring Boot 2.3.5。UI上的一个功能开始崩溃,我在调试时发现对UI的json响应已经改变了

原始回复:

"modelExplanation": [{
"sectionId": 0,
"sectionText": "some text",
"startIndex": "0",
"endIndex": "105",
"modelExplanations": [{
"modelId": "mdl_collusion",
"modelName": "collusion",
"modelVersion": "3.4.1",
"score": "1.0",
"riskStatus": "low"
},
{
"modelId": "mdl_mkt_mnpltn",
"modelName": "market_manipulation",
"modelVersion": "3.4.1",
"score": "1.0",
"riskStatus": "low"
},
{
"modelId": "mdl_secrecy",
"modelName": "secrecy",
"modelVersion": "3.4.1",
"score": "1.0",
"riskStatus": "low"
}]
}]
}

新响应:属性名称中有下划线(_(

"section_id": 1,
"section_text": "some text",
"start_index": "738",
"end_index": "1112",
"model_explanations": [{
"model_id": "mdl_collusion",
"model_name": "collusion",
"model_version": "3.4.1",
"section_score": "0.09059832",
"risk_status": "low"
},
{
"model_id": "mdl_mkt_mnpltn",
"model_name": "market_manipulation",
"model_version": "3.4.1",
"section_score": "0.12787165",
"risk_status": "low"
},
{
"model_id": "mdl_secrecy",
"model_name": "secrecy",
"model_version": "3.4.1",
"section_score": "0.19208406",
"risk_status": "low"
}]
}]
}

@JsonProperty似乎不起作用。我的课程如下:

public ModelExplanationResponse getModelExplanation(User user, ModelRequest request) {
ModelExplanationMetadata metadata = null;
try {
String modelExplanationJson = anotherService.getModelExplanation(user, request.getMessageId(), request.getSource(), request.getAvroId(), request.getRundate());

if (modelExplanationJson != null && !"".equals(modelExplanationJson)) {
metadata = mapJSONToMetadata(modelExplanationJson);
}
} catch (Exception e) {
throw new AlertMngtServiceException("Unable to retrieve attachment",e);
}
return getModelExplanationResponse(metadata, request);
}
private ModelExplanationResponse getModelExplanationResponse(ModelExplanationMetadata metadata, ModelRequest request) {
ModelExplanationResponse response = new ModelExplanationResponse();
if (metadata != null && metadata.getModelExplanation() != null) {
List<ModelExplanationSection> modelExplanation = mapJSONToModelExplanation(metadata.getModelExplanation());
if (!CollectionUtils.isEmpty(modelExplanation)) {
modelExplanation.sort(Comparator.comparing(ModelExplanationSection::getSectionId));
response.setModelExplanation(modelExplanation);
String formattedMessageBody = new ModelExplanationBasedMessageModifier().modify(request.getMessageBody(), modelExplanation);               
response.setMessageBody(formattedMessageBody);
}
} else {
LOGGER.info("Unable to fetch Model Explanation for {}", request);
}
return response;
}

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public class ModelExplanationSection {
private final int sectionId;
private final String sectionText;
private final String startIndex;
private final String endIndex;
private final List<ModelExplanation> modelExplanations;
@JsonCreator
public ModelExplanationSection(
@JsonProperty("section_id") int sectionId,
@JsonProperty("section_text") String sectionText,
@JsonProperty("start_index") String startIndex,
@JsonProperty("end_index") String endIndex,
@JsonProperty("model_explanations") List<ModelExplanation> modelExplanations) {
super();
this.sectionId = sectionId;
this.sectionText = sectionText;
this.startIndex = startIndex;
this.endIndex = endIndex;
this.modelExplanations = modelExplanations;
}
public int getSectionId() {
return sectionId;
}
public String getSectionText() {
return sectionText;
}
public String getStartIndex() {
return startIndex;
}
public String getEndIndex() {
return endIndex;
}
public List<ModelExplanation> getModelExplanations() {
return modelExplanations;
}
}


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.google.common.base.Strings;
@JsonIgnoreProperties(ignoreUnknown = true)
public class ModelExplanation {
private final String modelId;
private final String modelName;
private final String modelVersion;
private final String score;
private final String riskStatus;
@JsonCreator
public ModelExplanation(
@JsonProperty("model_id") String modelId,
@JsonProperty("model_name") String modelName,
@JsonProperty("model_version") String modelVersion,
@JsonProperty("section_score") String score,
@JsonProperty("risk_status") String riskStatus) {
super();
this.modelId = modelId;
this.modelName = modelName;
this.modelVersion = modelVersion;
this.score = score;
this.riskStatus = getRiskStatus(riskStatus);
}
private String getRiskStatus(String riskStatus) {
return Strings.isNullOrEmpty(riskStatus)?"low":riskStatus;
}
public String getModelId() {
return modelId;
}
public String getModelName() {
return modelName;
}
public String getModelVersion() {
return modelVersion;
}
public String getScore() {
return score;
}
public String getRiskStatus() {
return riskStatus;
}
}

我试过@JsonCreator(mode=JsonCreator.mode.PROPERTIES(,但它不起作用。找到了另一个关于堆栈溢出的解决方案,建议将jackson注释导入替换为org.codehaus.jackson.annote,但这对我来说也不起作用。

相同的类在这里被用于两个目的,1@JsonProperty用于将json响应从另一个服务映射到java对象,然后使用同一个java对象将jave对象串行化到ui。我不明白在丑闻发生之前它是如何运作的。

任何帮助都是非常值得的,因为这已经花了一天的时间,但我还不能确定和解决这个问题。

我无法使用Spring Boot 2.3.5 引入的Jackson 2.11.3来复制这一点

以下测试正确地使用camelCase进行了序列化。

public class DualNamingStrategy {
public static void main(String[] args) throws JsonProcessingException {
final String json = """
{
"model_id": "mdl_secrecy",
"model_name": "secrecy",
"model_version": "3.4.1",
"section_score": "0.19208406",
"risk_status": "low"
}
""";
final ObjectMapper mapper = new ObjectMapper();
final ModelExplanation explanation = mapper.readValue(json, ModelExplanation.class);
final String serialised = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(explanation);
System.out.println(serialised);
}
}

输出:

{
"modelId" : "mdl_secrecy",
"modelName" : "secrecy",
"modelVersion" : "3.4.1",
"score" : "0.19208406",
"riskStatus" : "low"
}

现在,这不是一个答案,所以我将在这里提供一个,尽管这是一个变通方法,因为问题似乎在你发布的代码之外的其他地方。

您还没有告诉我们您使用的Java版本,所以我假设它是8或更高版本,如果您使用7或更早版本,这将不起作用。

您可以删除所有@JsonProperty注释,添加Jackson Java 8 Parameter Names模块(以弥补删除的注释(,并使用两个具有不同命名策略的ObjectMapper

public class DifferentNamingStrategies {
public static void main(String[] args) throws JsonProcessingException {
final String json = "{n" +
"  "model_id": "mdl_secrecy",n" +
"  "model_name": "secrecy",n" +
"  "model_version": "3.4.1",n" +
"  "section_score": "0.19208406",n" +
"  "risk_status": "low"n" +
"}n";
// Default object mapper, this has camelCase just like the default in Spring
final ObjectMapper camelMapper = new ObjectMapper()
// This allows us to remove the @JsonProperty annotations from the constructor parameters
.registerModule(new ParameterNamesModule());
// Custom object mapper that we use to deserialise JSON with snake_case
final ObjectMapper snakeMapper = new ObjectMapper()
.registerModule(new ParameterNamesModule())
.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
final ModelExplanation explanation = snakeMapper.readValue(json, ModelExplanation.class);
final String serialised = camelMapper.writerWithDefaultPrettyPrinter().writeValueAsString(explanation);
System.out.println(serialised);
}
}

相关内容

  • 没有找到相关文章

最新更新