You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Jackson反序列化含自定义Getter与解包对象的问题

解决Jackson反序列化时Setter执行顺序导致的属性覆盖问题

问题核心

序列化可正常生成{"age":22,"name":"Alex Doe"}格式JSON,但反序列化阶段setFullname()先于setPerson()执行:

  • setFullname()会给PersonSerializer构造时创建的Person实例设置姓名
  • 随后setPerson()直接替换该实例为仅含age的新对象,最终导致姓名丢失,得到firstName: null, surname: null, age: 22的结果

由于无法修改Person类,需基于现有Mixin和PersonSerializer结构调整。

解决方案

核心是避免直接替换Person实例,改为合并属性。修改PersonSerializer的setPerson()方法,不再直接赋值引用,而是将传入对象的属性合并到已有的实例中:

public void setPerson(Person p) {
    // 合并属性,而非替换整个对象
    this.person.setAge(p.getAge());
}

逻辑说明

反序列化执行流程变为:

  1. PersonSerializer构造,初始化空Person实例
  2. 调用setFullname(),为该实例设置firstName和surname
  3. 调用setPerson(),仅将Jackson解析得到的age赋值给已有实例,保留之前设置的姓名属性

如果Person类还有其他需要反序列化的属性,只需在setPerson()中补充对应属性的合并逻辑即可。

验证效果

修改后运行测试代码,最终输出应为:

{"age":22,"name":"Alex Doe"}
firstName: Alex, surname: Doe, age: 22

内容的提问来源于stack exchange,提问作者Anho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:19:54