サーバーに送信する前に、Jax-WS によって生成された SOAP メッセージを文字列として操作することは可能ですか? メッセージが送信される直前に傍受し、いくつかのタグを変更したいと考えています。
SOAPリクエストをサーバーに送信する必要があるため、これを行いたいです。このリクエストのタグには、その内容として多数の xml ドキュメントが含まれています。ドキュメントごとに、いくつかのタグで名前空間を再宣言する必要があります (Jax-WS はインテリジェントに一度だけ宣言します)。プレフィックスは使用できません。xml にも署名する必要があります。メッセージを文字列として操作できれば、これらの問題はすべて簡単に解決できます。
軸で似たようなものを見たことがありますが、Jax-WS でこれを行う方法がわかりませんでした。
ありがとうございました。
更新:ハンドラー (SOAP ハンドラーと論理ハンドラーの両方) を使用しようとしました。私の問題は、ハンドラーでメッセージを変更した後でも、メッセージが Jax-WS によって変更されることです。SOAP メッセージの本文は次のようにする必要があります。
<soap12:Body>
<cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRecepcao">
<enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04">
<idLote>1</idLote>
<CTe xmlns="http://www.portalfiscal.inf.br/cte">
</CTe>
<CTe xmlns="http://www.portalfiscal.inf.br/cte">
</CTe>
</enviCTe>
</cteDadosMsg>
</soap12:Body>
CTe タグが名前空間宣言を繰り返す必要があることを確認してください (envCTe で使用されているものと同じです)。次の手順を実行しようとしました。
1) Jaxb を使用して、環境を含むドキュメントを作成しました。
2) 文字列に変換し、CTe タグの名前空間宣言を調整しました (String.replace を使用)。
3) xml 文字列を cteDadosMsg に追加しました。<
Jax-WS は文字をエスケープします (たとえば< を置き換えます)。Web サービスは、エスケープ文字を含む xml を認識しません。
4) ペイロードのエスケープを解除するための LogicalHandler を追加しました ( <
< などを置き換えます)。
5) これを行った後、Jax-WS は名前空間宣言を再度調整し、私の CTe タグの xmlns 属性は消えます。:P それは私の問題です。ハンドラーでメッセージを変更した後でも、Jax-WS はメッセージを「修正」します。
Jaxb によって生成された xml を文字列として追加する代わりに、ドキュメントとしても追加しようとしました。エスケープの問題はありませんが、すべての CTe タグに対して名前空間宣言を繰り返すことはまだできません。これを解決しても、xml のいくつかのタグに署名する必要があります。したがって、メッセージが送信される直前に傍受し、文字列として変更したいと思います。何か不足していますか?