2012-01-05 17 views
13

JAXBのアンマーシャリングに関する問題が発生しています。私はそれが適切にコード化されていると思うが、私のアンマーシャリングされたオブジェクトはnullパラメータで返されます。したがって、アンマーシャリングするとき、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

一つのアプローチは、あなたの注釈付きのクラスからXMLスキーマを生成するためにJAXBを使用することです。これは、JAXBが入力文書をどのように見えるかを表します。次に、このXMLスキーマに対してXML文書を検証して、JAXBの期待に適合しているかどうかを確認します。リンクについて

+0

感謝。前にそれを試みたことはありません。それはショットを与えるだろう。しかし、私がXSDからJAXBクラスを生成したことを前提とすると、それは逆に進んでいるようです。しかし、私はまだそれが優雅な解決策であるとは思わない。 JAXBは完全なブラックボックスのように動作しており、何が何をしているのかを示すインジケータがなくても、なぜ失敗しているのか分かりません。私はそれが何をしているのか、問題がどこにあるのかを「見る」ことができる方法を見つけたいと思っています。 –

+0

提案していただきありがとうございます。私はバリデーターを使ってみましたが、それは私が理解していないエラーを投げています。私はそれのための別のスレッドを作成しました(http://stackoverflow.com/questions/8761930/jaxb-unmarshal-validation-throws-cvc-elt-1-cannot-find-the-declaration-of-eleme)。あなたが何か提案することができれば、私はそれを高く評価します。ありがとう。 –

+0

確かに、それはこれまでに私が見つけた最良のアプローチです。[その他のアプローチ](http://stackoverflow.com/a/10227684/1864054)は、単に良い結果や生産的な結果を得られないからです。しかし、テストメッセージを生成するために 'soapUI'を使用することをお勧めします。なぜなら、(偽の)データ値を持たないメッセージスケルトンを生成するからです。代わりに、AltovaのXMLSpyは不思議に動作します。あなたがする必要があるのは、 'SOAP'メニューの'新しいSOAPリクエストの作成 '項目を選択するだけです。完全に動いている(偽の)メッセージを得ました。 – Withheld

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

このコードスニペットがどのように質問に答えるかに関するコメントDefaultValidationEventHandlerは古いJAXB 1.0ハンドラです - これは古いハンドラがもっと冗長なエラーメッセージを吐き出すので、これを答えとして提案していますか?Javadocから – Ryan

+0

: パブリッククラスDefaultValidationEventHandler は が検証イベントハンドラをデフォルトのみのValidationEventHandler JAXB 1.0を実装するオブジェクト拡張します。これは、JAXB 1.0バインディングコンパイラによって生成されたスキーマ派生コードを管理しているJAXBContextから作成されたすべてのオブジェクトのデフォルトのハンドラです。 このハンドラは、最初のエラーまたは致命的なエラーでunmarshalおよびvalidate操作が失敗するようにします。 – superbAfterSemperPhi

関連する問題