我遇到了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))中的子元素,它將自動失敗。但是,如果我將文檔轉換爲一個字符串,並將其重新導入到一個新文檔中,那麼它會很好地轉換它。
我開始非常沮喪,不知道如何調試此問題。
感謝您的任何見解!
埃裏克
感謝您的鏈接。以前從未嘗試過;會給它一個鏡頭。但考慮到我從XSD生成了JAXB類,它似乎倒退了。但我仍然覺得它不是一個優雅的解決方案。 JAXB表現得像一個完整的黑盒子,沒有任何指標可以解釋它在做什麼,我不知道它爲什麼會失敗。我很想找到一種方法讓我「看到」它在做什麼和/或問題出在哪裏。 – 2012-01-06 03:21:06
感謝您的建議。我試着使用驗證器,並且拋出一個我不明白的錯誤。我爲此創建了一個單獨的線程(http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme)。如果你能提出任何建議,我將不勝感激。謝謝。 – 2012-01-06 17:34:01
的確,這是迄今爲止我發現的最好方法,因爲[其他方法](http://stackoverflow.com/a/10227684/1864054)不會產生良好的和/或有效的結果。不過,我建議不要使用soapUI來生成測試消息,因爲它會生成沒有任何(假)數據值的消息框架,從而迫使您手動輸入容易出錯的所有內容,特別是對於大型消息。相反,Altova的XMLSpy創造了奇蹟。所有你需要做的就是從'SOAP'菜單中選擇'create New SOAP request'項目,瞧!你得到了一個完美的工作(假的)消息。 – Withheld 2013-10-02 19:52:43