杰克逊反序列化与子类
问题描述:
好吧,我知道有一堆类似的问题,但似乎没有任何工作。杰克逊反序列化与子类
我为我的实体设置了以下结构。
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
}
我想使用1个控制器方法与2个实体的单独控制器方法。但在以下使用上述结果。
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
有意义。
TRY 1
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="implementingClass")
public abstract class MyAbstractClass
我认为它 - 补充说,将存储子类中的元数据implementingClass
属性。
结果是什么。
Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'implementingClass' that is to contain type id (for class path.to.my.entity.MyAbstractClass)
试图用“阶级”,而不是“implementingClass”为property
,得到了类似的结果。
TRY 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")
到2子类。
其他尝试次数
我尝试了很多。什么都没有将不包括这里的一切。
我觉得应该有一个简单的方法来做到这一点,但我只是不断地配置错误的东西。
我觉得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时,我肯定会包含这个类型。我不会把这个包括进去,因为这是怪异的淘汰疯狂。
这不是很好。但它的工作。
你可以举一个你要提交给控制器的JSON的例子吗?对于你的'TRY 1',你告诉它在序列化中添加“implementsClass”,并在反序列化中查找“implementsClass”属性,但是你没有指定它。 [另见](http://*.com/questions/14222429/jackson-deserializing-nested-polymorphic-type) – xathien
好吧,那么回答的东西。我不想为JSON实现实现类。所以也许尝试1不是我想要做的。 Ty –
所以这可能归结为是否可以利用'getType'。我认为它不能成为一个实际的财产。 –