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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:27:04