如何使用Jackson反序列化继承Base类的Ext类并保留父类所有字段
问题根因
报错核心原因是@Value注解生成的不可变类没有Jackson可识别的反序列化构造器:
- Lombok的
@Value会将类标记为不可变,所有成员字段默认加final修饰,且不会生成无参构造函数 - 你自定义的
Ext全参构造函数没有指定参数与JSON属性的映射关系,Jackson无法自动匹配参数将JSON反序列化为实例
解决方案
提供两种可直接落地的方案,按需选择即可:
方案1:给Ext类的构造函数添加Jackson注解
在Ext的自定义构造函数上添加@JsonCreator,同时给每个构造参数加@JsonProperty指定对应的JSON字段名,修改后Ext类代码如下:
@Value @NonFinal public class Ext extends Base { private String bar; @JsonCreator public Ext(@JsonProperty("foo") String foo, @JsonProperty("bar") String bar) { super(foo); this.bar = bar; } }
该方案不需要修改ObjectMapper配置,侵入性低,适合只需要处理少量继承类的场景。
方案2:全局配置ObjectMapper支持Lombok注解(推荐,适合大量使用Lombok的项目)
第一步:引入jackson-lombok依赖(Maven示例):
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-lombok</artifactId> <version>2.15.2</version> <!-- 和你项目中jackson版本保持一致即可 --> </dependency>
第二步:初始化ObjectMapper时注册Lombok模块:
ObjectMapper mapper = new ObjectMapper() .registerModule(new LombokModule());
该方案不需要修改业务类代码,Jackson会自动识别Lombok生成的构造、getter/setter等信息完成反序列化。
效果验证
修改完成后再次运行测试用例,反序列化得到的Ext实例会自动包含父类Base的foo字段和自身的bar字段,不会再抛出构造器不存在的异常。
内容的提问来源于stack exchange,提问作者S K
相关产品推荐
相关产品推荐

