Java 使用@JsonAnyGetter复制字段

Java 使用@JsonAnyGetter复制字段,java,spring,jackson,jackson-databind,Java,Spring,Jackson,Jackson Databind,我有一个DTO类,其中包含预定义的字段和非映射的映射。当otherFields映射包含具有相同名称(field1键)的字段时,jackson会序列化这两个字段,我有无效的json { "field1": "value", "field1": "otherValue" } 公共类DTO实现可序列化{ 私有字符串字段1; @杰索尼奥雷 @JSONANYSETER private final Map otherField

我有一个DTO类,其中包含预定义的字段和非映射的映射。当otherFields映射包含具有相同名称(field1键)的字段时,jackson会序列化这两个字段,我有无效的json

{
"field1": "value",
"field1": "otherValue"
}
公共类DTO实现可序列化{
私有字符串字段1;
@杰索尼奥雷
@JSONANYSETER
private final Map otherFields=new LinkedHashMap();
@JsonAnyGetter
公共映射getOtherFields(){
返回其他字段;
}
公共字符串getField1(){
返回字段1;
}
公共无效集合字段1(字符串字段1){
此字段1=字段1;
}
}

在这种情况下,有没有办法只选择一个值?对于我的情况,map中的一个应该具有优先权。

我建议的最简单的解决方案是忽略属性,并在
getter
标记为
JsonAnyGetter
的注释中添加额外的逻辑来检查此条件:

class DTO {

    @JsonIgnore
    private String field1;

    private final Map<String, Object> otherFields = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getOtherFields() {
        otherFields.putIfAbsent("field1", field1);

        return otherFields;
    }

    @JsonAnySetter
    public void setOtherFields(String key, Object value) {
        otherFields.put(key, value);
    }

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }
}

要实现这一点,您应该为DTO类实现JsonSerializer,以便在序列化中编写逻辑method@AbhisekLamsal还有其他复杂的选择吗?我的类有很多字段和嵌套对象,都有相同的问题。我怀疑是否有其他方法可以解决您的特定问题。另一个选项可以是在所有字段中添加JsonIgnore,并修改getter和setter,以便在getter中从映射返回值,并在所有setter中向映射添加值。无论哪种方式,您都必须自定义此处的所有类
class DTO {

    @JsonIgnore
    private String field1;

    private final Map<String, Object> otherFields = new LinkedHashMap<>();

    @JsonAnyGetter
    public Map<String, Object> getOtherFields() {
        otherFields.putIfAbsent("field1", field1);

        return otherFields;
    }

    @JsonAnySetter
    public void setOtherFields(String key, Object value) {
        otherFields.put(key, value);
    }

    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }
}
class DTO {

    private String field1;
    private final Map<String, Object> otherFields = new LinkedHashMap<>();

    @JsonIgnore
    public Map<String, Object> getOtherFields() {
        return otherFields;
    }

    @JsonAnyGetter
    private Map<String, Object> internalJacksonGetOtherFields() {
        otherFields.putIfAbsent("field1", field1);

        return otherFields;
    }

    @JsonAnySetter
    public void setOtherFields(String key, Object value) {
        otherFields.put(key, value);
    }

    @JsonIgnore
    public String getField1() {
        return field1;
    }

    public void setField1(String field1) {
        this.field1 = field1;
    }
}