2

周りを見回して、提案されたさまざまな解決策を試した後、これを書いています。MTOM/非 MTOM SOAP メッセージからバイナリ データを抽出するために推奨される最も一般的な 2 つのソリューションは次のとおりです。

  1. OMText ノードを取得し、その中にある dataHandler インスタンスを使用します
  2. 「href」属性を含む OMElement ノードを見つけます。「cid:xxxxx」値を取得し、「xxxxx」部分を使用して、メッセージ コンテキスト インスタンスに存在する添付ファイル マップから添付ファイルを取得します。

私が直面している問題は、クライアントが SOAP 応答メッセージが MTOM であることを示していることです [これは、メッセージ コンテキスト インスタンスの isDoingMTOM() メソッドを使用して判断しました]。ただし、「href」属性を含む OMElement ノードはありません。SOAP エンベロープを印刷すると、バイナリ データが本文内にインラインで存在することがわかりました。そこで、データを取得するために OMText ノード アプローチを試みましたが、OMElement を対応する OMText ノードにキャストしようとすると、常に classCastException が発生します。

誰かが私が見逃していることを指摘できますか?

4

1 に答える 1

2

SOAPEnvelope Axiom オブジェクトをどのように出力していますか? toString() メソッドを呼び出している場合、これにはいくつかの不幸な副作用があります。具体的には、toString() メソッドにより、Axiom は基礎となる SOAP メッセージを解析し、生の XML を表す Axiom オブジェクト グラフ (OMElement ノードなど) を構築します。オブジェクト グラフが構築されているため、Axiom は XML の表現をわずかに変更する場合があります。

toString() の動作について説明している Axiom のサイトからのリンクを次に示し ます。

特に MTOM メッセージの場合、Axiom はオブジェクト グラフを構築しているため、未加工のバイナリ MTOM 添付ファイルを指す要素を未加工のバイナリの Base64 でエンコードされたテキスト表現に置き換えます。これにより、MTOM を使用する利点が事実上なくなります (MTOM を使用すると、バイナリのサイズを肥大化させる Base64 エンコーディング プロセスを省略します)。デバッガーで Axiom Object グラフを見ると、要素の置換も行われます (そうすると toString() メソッドも呼び出されるため)。

XMLバインディングフレームワークとしてADBを使用していますか?

于 2010-12-13T15:21:17.357 に答える