Jackson用子类反序列化



好吧,我知道有一堆类似的问题,但似乎没有工作。

我为我的实体设置了以下结构。

public abstract class MyAbstractClass {
   // bunch of properties, getters, and setters that subclasses share
   public abstract String getType();
}
public class MySubclass1 extends MyAbstractClass {
    //  a few unique properties, getters, and setters
    public String getType() {
        return "Type_1"; //always the same for each instance of MySubclass1
    }
}
public class MySubclass2 extends MyAbstractClass {
    //  a few unique properties, getters, and setters
    public String getType() {
        return "Type_2"; //always the same for each instance of MySubclass2
    }
}
在我的控制器中,我尝试将请求映射到以下方法。
public @RequestBody MyAbstractClass saveObject(@RequestBody MyAbstractClass mac) {
    // call model to save object
}

我想使用一个控制器方法,而不是两个实体的单独方法。但是使用上面的结果在下面。

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

是有意义的。

尝试1

@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="implementingClass")
public abstract class MyAbstractClass

我认为它所做的-添加一个元数据implementingClass属性,将存储子类class。

结果是什么

Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'implementingClass' that is to contain type id  (for class path.to.my.entity.MyAbstractClass)

尝试用"class"代替" implemingclass "用于property,得到类似的结果。

尝试2

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({
    @Type(name="MySubclass1", value=MySubclass1.class),
    @Type(name="MySubclass2", value=MySubclass2.class)
})
public abstract class MyAbstractClass

我认为它做什么-使用定义的name做某种包装的东西。

结果是什么

Could not resolve type id 'myUuid' into a subtype of [simple type, class path.to.my.entity.MyAbstractClass]

即使将@JsonTypeName("MySubclass1")@JsonTypeName("MySubclass2")添加到两个子类中,结果也相同。

其他尝试

我试了很多。没有什么工作。这里不包括所有内容。

我觉得应该有一个简单的方法来做到这一点,但我只是不断地配置错误的东西。

我觉得getType可能会被利用,但我不想为类型添加一个实际的属性(它只是一个助手方法)。我还想用注解而不是其他选项来做这个。

谢谢。

我明白了,但我想我还是回答吧,以防其他人也有这个问题。

我在子类中添加了一个type属性,而不仅仅是一个助手方法(下面包括一个示例)。

public class MySubclass1 extends MyAbstractClass {
    @Transient
    private final String type = "TYPE_1";
    public String getType() {
        return type;
    }
}

然后我对抽象超类做了以下操作。

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
    @Type(name="TYPE_1", value=MySubclass1.class),
    @Type(name="TYPE_2", value=MySubclass2.class)
})
public abstract class MyAbstractClass

在提供JSON时,我确定包含了类型。我就不写这个了,因为这太疯狂了。

不太好。

最新更新