2012-10-05 149 views
22

我使用傑克遜,我有問題,當我試圖反序列化對象,我得到以下錯誤:不能構造的實例 - 傑克遜

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; 

任何人都可以幫助我嗎?

+0

有關類似情況的另一個討論在https://stackoverflow.com/a/32777371/873282完成。特別有趣的是註釋說使用'@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS,include = JsonTypeInfo.As.PROPERTY,property =「type」)''。這樣,JSON有點大,但它是明確的,應該使用哪種類型。 – koppor

回答

24

你不能讓一個抽象類instanciate,傑克遜既不。 你應該給Jackson提供關於如何用具體類型實例化MyAbstractClass的信息。

查看計算器這樣的回答:Jackson JSON library: how to instantiate a class that contains abstract fields

也許還看到Jackson Polymorphic type handling

+2

感謝您的幫助,我決定用: 'JsonTypeInfo.Id.NAME,包括= JsonTypeInfo.As.PROPERTY,財產= 「類」)' 的'屬性= 「類」',在我的JSON通知來了什麼孩子班將被使用。 –

+1

請注意,允許用戶指定在反序列化過程中使用哪個類可能導致諸如[this]之類的漏洞(http://fishbowl.pastiche.org/2015/11/09/java_serialization_bug/)。 –

+0

感謝您的參考:@JsonTypeInfo(使用= JsonTypeInfo.Id.CLASS,包括= JsonTypeInfo.As.PROPERTY,屬性=「@class」)是訣竅。就像JPA表中的descriminator值一樣。謝謝。 – 99Sono

6

@JsonSubTypes聲明沒有意義:它需要列出實現(子)類,而不是類本身(這將毫無意義)。所以你需要修改該條目以列出子類(es);或使用其他一些機制來註冊子類(SimpleModule有類似addAbstractTypeMapping)。