You need to enable JavaScript to run this app. 如何使用Jackson反序列化多层继承的抽象类对象,解决实例化异常问题
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Jackson反序列化多层继承的抽象类对象,解决实例化异常问题

问题原因
  • 多层抽象类继承场景下,中间抽象类(People、Animal)未提供无参构造方法:Jackson解析到BaseClass的version字段匹配到People类后,先尝试实例化People类,由于它是抽象类且没有可用构造器,直接抛出异常,没有继续向下解析People类上配置的第二层多态映射规则。
  • Child类构造方法的age字段对应的@JsonProperty注解值错误写为id,与序列化生成的JSON中的age字段名不匹配,反序列化时无法正确赋值。
修复方案

方案1:保留两层多态逻辑(适配后续扩展People、Animal的子类场景)

  1. 给所有抽象类添加protected修饰的无参构造方法,供Jackson反序列化时调用:
// BaseClass新增
protected BaseClass() {}

// Animal新增
protected Animal() {}

// People新增
protected People() {}
  1. 修正Child类构造方法的字段注解:
@JsonCreator
public Child(@JsonProperty("age") int age, @JsonProperty("type") String type, @JsonProperty("version") String version) {
    super(type, version);
    this.age = age;
}

修改后重新运行代码即可正常完成序列化、反序列化操作。

方案2:简化多态配置(无需中间层多态规则的场景)

直接将BaseClass的子类型映射指向最终的具体实现类,删除People、Animal上的多态相关注解即可:

@JsonSubTypes({
        @JsonSubTypes.Type(value = Child.class, name = "v1"),
        @JsonSubTypes.Type(value = Dog.class, name = "v2"),
})
public abstract class BaseClass {
    // 原有逻辑不变
}

// 可删除People、Animal类上的@JsonTypeInfo、@JsonSubTypes注解

该方案适配不需要通过type字段动态匹配People、Animal子类的场景,代码更简洁,性能也更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 02:54:05