好吧,我知道有一堆類似的問題,但似乎沒有任何工作。傑克遜反序列化與子類
我爲我的實體設置了以下結構。
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
可能會被利用,但我不想爲類型添加一個實際的屬性(它只是一個輔助方法)。另外我想用註釋和其他選項來做到這一點。
謝謝。
你可以舉一個你要提交給控制器的JSON的例子嗎?對於你的'TRY 1',你告訴它在序列化中添加「implementsClass」,並在反序列化中查找「implementsClass」屬性,但是你沒有指定它。 [另見](http://stackoverflow.com/questions/14222429/jackson-deserializing-nested-polymorphic-type) – xathien
好吧,那麼回答的東西。我不想爲JSON實現實現類。所以也許嘗試1不是我想要做的。 Ty –
所以這可能歸結爲是否可以利用'getType'。我認爲它不能成爲一個實際的財產。 –