【问题标题】:Same json field set to different attribute in java pojojava pojo中相同的json字段设置为不同的属性
【发布时间】:2019-02-11 20:31:04
【问题描述】:

我想在 java pojo 中将一个 json 字段设置为两个属性。当我在 pojo 中将 jsonproperty 用于重复属性时,每次都有一个字段为空。

我的 pojo 对象是;

public class PojoTest {

    private String receiverAccountNo;

    private String originalReceiverAccountNo;

    @JsonProperty("receiverAccountNo")
    public String getOriginalReceiverAccountNo() {
        return originalReceiverAccountNo;
    }

    @JsonProperty("receiverAccountNo")
    public void setOriginalReceiverAccountNo(String originalReceiverAccountNo) {
        this.originalReceiverAccountNo = originalReceiverAccountNo;
    }

    public String getReceiverAccountNo() {
        return receiverAccountNo;
    }

    public void setReceiverAccountNo(String receiverAccountNo) {
        this.receiverAccountNo = receiverAccountNo;
    }
}

我的要求是;

{
    "receiverAccountNo":"566665"
}

我的测试控制器是;

@PostMapping("/test2")
public String test2(@RequestBody PojoTest pojoTest) {
    return "OriginalReceiverAccountNo:"+pojoTest.getOriginalReceiverAccountNo()+" ReceiverAccountNo:"+pojoTest.getReceiverAccountNo();
}

当我运行代码时,我得到以下响应;

OriginalReceiverAccountNo:566665 ReceiverAccountNo:null

我正在使用 jackson-annotation-2.9.0 依赖项。我该如何解决这个问题?

【问题讨论】:

  • 尝试为 ReceiverAccountNo 的 get 和 setter 注释 JsonProperty。我相信它是空的,因为您没有告诉注释为您填写该属性。
  • 我遇到了异常; 2019 年 2 月 11 日 23:44:32.858 警告 [http-nio-8081-exec-1] org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.logWarningIfNecessary 无法评估 Jackson 反序列化类型 [[simple type, class com. ykb.frd.fraudws.PojoTest]]:com.fasterxml.jackson.databind.JsonMappingException:属性“receiverAccountNo”的设置器定义冲突:com.ykb.frd.fraudws.PojoTest#setReceiverAccountNo(1 params) vs com.ykb.frd .fraudws.PojoTest#setOriginalReceiverAccountNo(1 参数)
  • 在下面查看我的答案。我认为您不需要对 setter 函数进行注释。
  • 我尝试了您的解决方案,但收到了同样的异常

标签: java spring rest jackson


【解决方案1】:

你可以像这样使用构造函数映射,它设置两个属性给一个@JsonProperty

public class Pojo
{
    private final String receiverAccountNo;
    private final String originalReceiverAccountNo;


    @JsonCreator
    public Observation(
            @JsonProperty("receiverAccountNo") String value)
    {
        this.receiverAccountNo = value;
        this.originalReceiverAccountNo = value;
    }

我更喜欢这种方法来创建不可变对象,但如果你愿意,你可以让它保持可变

【讨论】:

    【解决方案2】:

    这是不可能的。一个 json 字段映射到一个 pojo 属性。

    但是,您可以更改 pojo 的行为,以便其中一个的设置器也设置另一个的值:

    @JsonProperty("receiverAccountNo")
    public void setOriginalReceiverAccountNo(String originalReceiverAccountNo) {
        this.originalReceiverAccountNo = originalReceiverAccountNo;
        this.receiverAccountNo = originalReceiverAccountNo;
    }
    
    
    public void setReceiverAccountNo(String receiverAccountNo) {
        this.receiverAccountNo = receiverAccountNo;
        this.originalReceiverAccountNo = receiverAccountNo;
    }
    

    这样 pojo 中的两个字段将具有相同的值。

    【讨论】:

    • 感谢您的回复,但如果我更改 recevierAccountNo 字段,当我使用您的解决方案时,我不希望出现这种情况,originalRecevierAccountNo 已更新为 recevierAccountNo。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多