无法构造 - 杰克逊的实例

2022-08-31 11:33:45

我正在使用Jackson,但我遇到了问题,当我尝试反序列化对象时,我收到以下错误:

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
        have custom deserializer, or be instantiated with additional type information

我在属性中遇到问题:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id")
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") })
@ManyToOne
private MyAbstractClass object;

任何人都可以帮我吗?


答案 1

你不能实例化一个抽象类,Jackson也不能。您应该向 Jackson 提供有关如何使用具体类型实例化 MyAbstractClass 的信息。

在 stackoverflow 上查看此答案:Jackson JSON 库:如何实例化包含抽象字段的类

也许还可以看到杰克逊多态反序列化


答案 2

在反序列化时,您需要使用具体类而不是抽象类。如果 Abstract 类有多个实现,那么在这种情况下,你可以按如下方式使用它-

  @JsonTypeInfo( use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
    @JsonSubTypes({ 
      @Type(value = Bike.class, name = "bike"), 
      @Type(value = Auto.class, name = "auto"), 
      @Type(value = Car.class, name = "car")
    })
    public abstract class Vehicle {
        // fields, constructors, getters, setters
    }

推荐