我有以下课程:
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Options {
@JsonProperty("value")
private String value;
@JsonProperty("value")
private Value valueObj;
}
我在使用 Jackson 时看到以下错误:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Conflicting getter definitions for property "value": Options#getValue() vs Options#getValueObj()
我的JSON是这样的:
{
"behaviors": [
{
"name": "dnsAsyncRefresh",
"options": {
"enabled": true,
"timeout": "1h",
"value": {
"id": "1234"
}
}
},
{
"name": "timeout",
"options": {
"value": "5s"
}
}
]
}
我使用相同的
Options
类来映射 JSON 中的所有选项。
出现此问题的原因是您有两个用
@JsonProperty("value")
注释的字段,导致反序列化过程中发生冲突。在您的 Options
类中,value
和 valueObj
都使用相同的 JSON 属性名称“value”进行注释。 Jackson 在遇到 JSON 中的“value”属性时无法确定要映射哪个字段。
一个简单的解决方案是:
Options
类中的属性之一以避免冲突。例如,将第二个属性重命名为 valueObject
。import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Options {
@JsonProperty("value")
private String value;
@JsonProperty("valueObject")
private Value valueObject;
}
{
"behaviors": [
{
"name": "dnsAsyncRefresh",
"options": {
"enabled": true,
"timeout": "1h",
"valueObject": { // <--- Here
"id": "1234"
}
}
},
{
"name": "timeout",
"options": {
"value": "5s"
}
}
]
}
通过将第二个属性重命名为
valueObject
并相应地更新 JSON,您可以消除冲突,并且 Jackson 将能够正确地将 JSON 反序列化到 Options
类中。