2013-02-01 69 views
1

我正在使用RESTeasy將JSON從負載轉換爲Web服務器中的POJO。當那些POJO成員之一是通用的時,我遇到了一個問題。使用RESTeasy管理屬性繼承

例如:

public class MainPOJO 
{ 
    private MyParentClass c; 

    [...] 
} 

public class MyParentClass 
{ 
    [...] 
} 

public class MyFirstChildClass extends MyParentClass 
{ 
    private int number; 

    [...] 
} 

public class MySecondChildClass extends MyParentClass 
{ 
    private boolean isTrue; 

    [...] 
} 

在請求負載(PUT)由客戶端,你可以發現這樣的JSON(請注意,我在JSON格式中的「C」屬性發送MyFirstChildClass相當於):

{ 
    c: {number:10} 
} 

有沒有辦法告訴RestEasy的該屬性「C」在MainPOJO可以是MyParentClass,MyFirstChildClass或MySecondChildClass的實例?

目前,它只是試圖instanciate MyParentClass新實例,但拋出一個錯誤,說該屬性,例如,「數字」不標記爲可忽略的。但我希望它可以更智能化,並根據json中的屬性從樹中的正確類實例化一個對象。

可能嗎?

謝謝!

+0

您是使用Jettison還是Jackson提供商? – Perception

+0

我們正在使用傑克遜提供商。 – NinjaFisherman

回答

1

假設您使用的是傑克遜提供商,那麼處理此問題的最佳方法是通過JsonTypeInfo註釋。使用它會告訴Jackson你想要在生成的JSON中包含類型提示,它可以用來解析反序列化時的實際類型。

總是包括類型信息,當你MyParentClass被序列化,你會註釋類本身:

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class") 
public class MyParentClass { 
} 

或者,只包含的類型信息MyParentClassMainPojo對象被序列化,你會註釋該字段:

public class MainPOJO { 
    @JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="class") 
    private MyParentClass c; 
} 

請參閱Jackson documentation on JsonTypeInfo以瞭解有關覆蓋和選項的更多詳細信息。

+0

哇,它是自動的:P謝謝! – NinjaFisherman