使用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()); }
逻辑说明
反序列化执行流程变为:
PersonSerializer构造,初始化空Person实例- 调用
setFullname(),为该实例设置firstName和surname - 调用
setPerson(),仅将Jackson解析得到的age赋值给已有实例,保留之前设置的姓名属性
如果Person类还有其他需要反序列化的属性,只需在setPerson()中补充对应属性的合并逻辑即可。
验证效果
修改后运行测试代码,最终输出应为:
{"age":22,"name":"Alex Doe"} firstName: Alex, surname: Doe, age: 22
内容的提问来源于stack exchange,提问作者Anho
相关产品推荐
相关产品推荐

