2010-06-25 68 views
8

我目前使用傑克遜1.4.2並嘗試反序列化code值(類型信息的唯一標識符),這些值從我們的UI傳遞迴Java控制器(Servlets)。傑克遜不承認@JsonCreator註釋

有多種類型(例如ABCTypeXYZType等),所有從AbstractType延伸,但是每個具體類型具有靜態工廠方法,該方法作爲一個參數,一個唯一的標識符,並返回型對象(名稱,關聯類型,描述,有效首字母縮略詞等)。每個具體類型中的靜態方法(如XYZType)標註有@JsonCreator

@JsonCreator 
public static XYZType getInstance(String code) { 
    ..... 
} 

,我雖然看到的問題是由傑克遜的映射器嘗試反序列化JSON這些類型拋出一個異常:

引起:org.codehaus.jackson.map.JsonMappingException:找不到類型爲[簡單類型,類com.company.type.XYZtype]的默認構造函數:無法從Json對象實例化。

我錯過了@JsonCreator註釋靜態工廠方法(或它與傑克遜做1.4.2從AbstractType延長了具體類型掙扎?)這裏?

回答

12

註解@JsonCreator需要註解@JsonProperty。這Jackson wiki page給出的資料很少,但確實提供了示例代碼:

@JsonCreator 
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f) 
{ 
    givenName = g; 
    familyName = f; 
} 

您將在this blog post找到更詳細的解釋。因此

示例代碼應該是這個樣子:

@JsonCreator 
public static XYZType getInstance(@JsonProperty("someCode") String code) 
{ 
... 
} 
4

問題是傑克遜只能看到聲明的基本類型,並不知道在哪裏尋找子類型。 由於在1.5中添加了完整的多態類型處理,所以您需要做的1.4是在基類中添加工廠方法並從那裏調度方法。