如何使用Jackson反序列化多层继承的抽象类对象,解决实例化异常问题
问题原因
- 多层抽象类继承场景下,中间抽象类(People、Animal)未提供无参构造方法:Jackson解析到BaseClass的
version字段匹配到People类后,先尝试实例化People类,由于它是抽象类且没有可用构造器,直接抛出异常,没有继续向下解析People类上配置的第二层多态映射规则。 - Child类构造方法的
age字段对应的@JsonProperty注解值错误写为id,与序列化生成的JSON中的age字段名不匹配,反序列化时无法正确赋值。
修复方案
方案1:保留两层多态逻辑(适配后续扩展People、Animal的子类场景)
- 给所有抽象类添加protected修饰的无参构造方法,供Jackson反序列化时调用:
// BaseClass新增 protected BaseClass() {} // Animal新增 protected Animal() {} // People新增 protected People() {}
- 修正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
相关产品推荐
相关产品推荐

