2015-10-14 140 views
3

好吧,我知道有一堆類似的問題,但似乎沒有任何工作。傑克遜反序列化與子類

我爲我的實體設置了以下結構。

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可能會被利用,但我不想爲類型添加一個實際的屬性(它只是一個輔助方法)。另外我想用註釋和其他選項來做到這一點。

謝謝。

+0

你可以舉一個你要提交給控制器的JSON的例子嗎?對於你的'TRY 1',你告訴它在序列化中添加「implementsClass」,並在反序列化中查找「implementsClass」屬性,但是你沒有指定它。 [另見](http://stackoverflow.com/questions/14222429/jackson-deserializing-nested-polymorphic-type) – xathien

+0

好吧,那麼回答的東西。我不想爲JSON實現實現類。所以也許嘗試1不是我想要做的。 Ty –

+0

所以這可能歸結爲是否可以利用'getType'。我認爲它不能成爲一個實際的財產。 –

回答

4

我想通了,但我想我會回答,以防其他人有這個問題。

我添加了一個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時,我肯定會包含這個類型。我不會把這個包括進去,因爲這是怪異的淘汰瘋狂。

這不是很好。但它的工作。