2010-04-13 105 views
18

我正在使用JAXB將XML文件解組到對象樹中。根對象是非空的,但即使XML文件中有數據,它的所有成員都是空的。我的對象類是使用wsdls的Axis2生成的。我有ObjectFactory類中,jaxb.in​​dex班,package.info註釋等JAXB Unmarshall創建了一個空對象

我的問題是一樣的討論:http://old.nabble.com/AXIS2,-JAXB---Unmarshalling-td26847419.html

首先:有沒有方法可以讓我得到它正確填寫數據?

如果不是,Axis2或JAXB是否有一個很好的替代庫可以完成相同的功能,但它們可以很好地相互協作?

+0

在我們回答這個問題之前,我們需要一些樣本JAXB類和XML。 – skaffman 2010-04-19 13:32:29

+0

你知道是什麼導致了這個問題嗎? – Kimble 2010-06-16 14:07:44

回答

46

默認情況下JAXB忽略錯誤。我看不出爲什麼這是默認配置。嘗試添加此代碼以在出現問題時拋出異常。

unmarshaller.setEventHandler(
    new ValidationEventHandler() { 
     public boolean handleEvent(ValidationEvent event) { 
      throw new RuntimeException(event.getMessage(), 
             event.getLinkedException()); 
     } 
}); 
+3

+10!經過一個小時的無盡頭撞,我到達你的小費。謝謝... – Ittai 2012-01-17 15:14:01

+0

偉大的建議。然而,我謹慎對待JAXB開發人員不太好--JAXB的大部分內容都是由Jenkins,Kohsuke Kawaguchi背後的天才撰寫的。允許可插入的事件處理程序允許極大的靈活性(以簡單爲代價)。 – JaysonRaymond 2012-08-13 17:24:53

+2

@JaysonRaymond - 你說得對,我不應該使用這些詞。但是,剛發現我浪費了兩天的工作時間,因爲JAXB默默無視錯誤令人沮喪,至少可以說。我強烈地認爲這不應該是默認配置,但我會在我的答案中編輯措辭。 – 2012-08-14 12:42:17

0

只是想補充一點,當Axis2的與古城牆(SOAP體加密)和JAXB一起使用,這個問題總是發生。

詳情請參見:AXIS2-4981

1

最近我有類似的問題,那並可能能夠如下修復它:

1)修正XSD文件。 在我的情況下,我確保xsd中的所有複雜元素都使用ref屬性引用其相應的類型,而不是使用type屬性聲明它們。

我已通過在Eclipse中從XML Schema文件選項創建XML文件來驗證我的xsd是否正確。

修復之前,xml文件中的根元素爲空。修復了xsd之後,xml被正確創建了一些示例值。

2)清理並重新構建 重新生成類之前必須清理。

0

必須編譯package-info.java文件。 Eclipse必須找到所有的.java文件並編譯它們。如果從命令行編譯,並讓javac搜索依賴項,它將不會找到它。然後當你運行你會得到空的物體。看起來像JAXB中的一個錯誤,至少不會導入某個文件。錯誤應該告訴你可能編譯該文件。