2011-05-17 105 views
5

嘿, 我有2個類。 當我試圖從它們創建一個XML結構時,我只得到根元素(A)。 爲什麼?我是否使用錯誤的註釋?JAXB類層次結構的註釋

@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 
    @XmlElement 
    int a; 

    protected A(){ 
    } 
} 

@XmlAccessorType(XmlAccessType.FIELD) 
public class B extends A{ 
    @XmlElement 
    int b; 

    protected B(){ 
    } 
}  
+0

我當然有getter/setter。 – Udi 2011-05-17 12:45:22

回答

7

您可能需要使用@XmlSeeAlso標註在頂級:

@XmlSeeAlso(B.class) 
@XmlRootElement(name = "a") 
@XmlAccessorType(XmlAccessType.FIELD) 
public abstract class A{ 

我寫了「可能」,因爲它取決於你如何設置你的JAXB上下文。基本上你需要確保所有應該被序列化的類都被JAXB知道。如果您的B類在其他地方沒有提及(例如作爲JAXB已知的 類之一的屬性類型),那麼JAXB就沒有機會知道如何序列化B的實例。 @XmlSeeAlso註釋的目的是爲了確保JAXB也查看這些列出的類。

UPDATE:

另外,您可以使用JAXBContext.newInstance(Class...)創建JAXBContext對象時提供所有子類的列表,如:

JAXBContext.newInstance(A.class, B.class); 

,而不是

JAXBContext.newInstance(A.class); 

您可能已經做。

但我認爲這是一個更糟糕的解決方案,因爲它讓你每次在代碼中使用JAXB時都會想到相關的類。在頂級解決方案中,您永遠將關係設置一次。

+0

感謝您的回覆。這實際上有效,但它是一個糟糕的面向對象解決方案......這是唯一的方法嗎? JAXB不知道,如果沒有我給他打翻? – Udi 2011-05-17 13:00:35

+0

@Udi:看我的更新 – 2011-05-17 13:15:29

+0

謝謝!我認爲這很好:) – Udi 2011-05-17 13:19:06