2016-10-27 51 views
0

映射抽象類,我下面的博客文章: http://blog.bdoughan.com/2010/11/jaxb-and-inheritance-using-xsitype.htmljava.lang.InstantiationException而使用JAXB

,我已經做了所有同樣的事情,不同的是我的子類是不公開的,並且在同一個文件抽象類文件的。我得到java.lang.InstantiationException異常 javax.xml.bind.UnmarshalException:無法創建org.apache.ambari.server.state.DependencyConditionInfo的實例 - 與鏈接的異常: [java.lang.InstantiationException] at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647)

編輯

當我使用@XmlSeeAlso我需要提供一個默認的構造,因我無法初始化子類的數據成員。

任何人都可以幫我找到解決方案嗎?謝謝

回答

2

爲什麼這是失敗的,因爲Jaxb將嘗試創建用戶的實例。這是抽象的,因此是失敗的。

在您的抽象類中添加註釋

@XmlTransient //Prevents the mapping of a JavaBean property/type to XML representation 
@XmlSeeAlso({Admin.class, <other class>}) //Instructs JAXB to also bind other classes when binding this class 

看到每個(XmlTransientXmlSeeAlso)的Javadoc

這將完成爲防止JAXB從試圖初始化抽象類。

我發現這種方法唯一的缺點是會有額外的名稱空間信息添加到創建的XML中。

通過@解決wyche5000

+0

盧卡你好,謝謝,這個異常增加@XmlSeeAlso後去了,但這個標籤預計該子類的一個默認的構造函數。如果我添加默認構造函數,我會得到一個NullPointerException,因爲子類的參數未初始化。你能指出一些嗎? – Amruta