2012-01-05 63 views
13

我遇到了JAXB解組問題。我想我已經正確編碼了,但我的未編組對象返回空參數。因此,我假設解組時,JAXB沒有看到它期望的合適的XML結構。但是,我沒有收到任何錯誤消息或拋出任何異常。如何調試JAXB解組?

反正有沒有辦法通過解組過程來確切地知道它在哪裏/爲什麼沒有填充我的對象?

實際的解組代碼是相當平凡:

public <T> T unmarshall(Node node, Class<T> clazz) throws JAXBException { 
    // Creating an unmarshaller 
    Unmarshaller u = JAXBContext.newInstance(clazz).createUnmarshaller(); 

    // unmarshal an instance node into Java content 
    return clazz.cast(u.unmarshal(node, clazz).getValue()); 
} 

然而,當我打電話吧,我得到類型clazz中的對象返回(如預期),但無人居住。

我試圖解組的DOM對象是由第三方API生成的。我已經遇到了一些非常奇怪的行爲,因此我希望能夠調試這個過程。例如,如果我嘗試解組DOM對象(即:doc.getByElementName(「myElement」)。item(0))中的子元素,它將自動失敗。但是,如果我將文檔轉換爲一個字符串,並將其重新導入到一個新文檔中,那麼它會很好地轉換它。

我開始非常沮喪,不知道如何調試此問題。

感謝您的任何見解!

埃裏克

回答

7

一個你可以採取的方法是使用JAXB生成從註釋類的XML模式。這表示JAXB期望輸入文檔的外觀。然後根據這個XML模式驗證您的XML文檔,看它是否符合JAXB的期望。

+0

感謝您的鏈接。以前從未嘗試過;會給它一個鏡頭。但考慮到我從XSD生成了JAXB類,它似乎倒退了。但我仍然覺得它不是一個優雅的解決方案。 JAXB表現得像一個完整的黑盒子,沒有任何指標可以解釋它在做什麼,我不知道它爲什麼會失敗。我很想找到一種方法讓我「看到」它在做什麼和/或問題出在哪裏。 – 2012-01-06 03:21:06

+0

感謝您的建議。我試着使用驗證器,並且拋出一個我不明白的錯誤。我爲此創建了一個單獨的線程(http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme)。如果你能提出任何建議,我將不勝感激。謝謝。 – 2012-01-06 17:34:01

+0

的確,這是迄今爲止我發現的最好方法,因爲[其他方法](http://stackoverflow.com/a/10227684/1864054)不會產生良好的和/或有效的結果。不過,我建議不要使用soapUI來生成測試消息,因爲它會生成沒有任何(假)數據值的消息框架,從而迫使您手動輸入容易出錯的所有內容,特別是對於大型消息。相反,Altova的XMLSpy創造了奇蹟。所有你需要做的就是從'SOAP'菜單中選擇'create New SOAP request'項目,瞧!你得到了一個完美的工作(假的)消息。 – Withheld 2013-10-02 19:52:43

10
JAXBContext context = JAXBContext.newInstance(jaxbObjectClass); 
Unmarshaller unmarshaller = context.createUnmarshaller(); 
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler()); 
+1

關於這個代碼片段如何回答這個問題的一兩個評論DefaultValidationEventHandler是舊的JAXB 1.0處理程序 - 對嗎?你是否認爲這是一個答案,因爲舊的處理程序會吐出更詳細的錯誤消息? – Ryan 2015-05-22 18:27:58

+0

從的javadoc: 公共類DefaultValidationEventHandler 擴展對象 實現的ValidationEventHandler JAXB 1.0只有在默認驗證事件處理程序。這是從JAXBContext創建的所有對象的默認處理程序,該JAXBContext管理由JAXB 1.0綁定編譯器生成的模式派生代碼。 此處理程序會導致解組和驗證操作在第一個錯誤或致命錯誤時失敗。 – superbAfterSemperPhi 2015-09-03 17:17:20