現在、2つのハンドラーがあります。1つはロギング用で、もう1つはSOAPメッセージに署名するためのものです(これは本質的にSOAPメッセージを改ざんします)。ハンドラチェーンがない場合、MTOMは期待どおりに機能し、base64バイナリコンテンツをインライン化するのではなく、バイナリコンテンツへの参照を挿入します。
ハンドラーを導入するとすぐに、MTOMコンテンツがインラインに含まれるようになりました。
ハンドラーを使用してSOAPメッセージに署名することは可能ですか、それともこれを行うためのより適切な手段がありますか?
アップデート1 完全なソースを投稿できません。ただし、基本的には、カスタムSOAPHandlerの実装です。タイムスタンプ(ヘッダー内)、カスタムヘッダー、およびSOAP本体に対していくつかの基本的なXMLDsigタイプの操作を実行します。結果のダイジェスト値は、ヘッダーの署名要素に挿入されます。
ロガーに関しては、これも単純なSOAPHandlerです。それまたは署名ハンドラーのいずれかが排他的に使用される場合、結果は同じであり、バイト内容がインライン化されたMTOMメッセージです。私が行った唯一の進歩は、ロギングにMessageHandlerを使用することでした。これにより、(バイトコンテンツがインライン化されていても)SOAPエンベロープを出力し、MTOM分離を維持することができました。したがって、実際には解決策ではありませんが、SOAPメッセージの変更を下位レベルで行う必要があることを示しています。これは私をチューブの道へと導いてくれます。
アップデート2
以下は、MessageHandler
アプローチの例です。生のHTTPダンプには複数の部分からなるメッセージが含まれているのに対し、実際の出力はbase64にインライン化されていることがわかります。この実装と実装の唯一の違いSOAPHandler
は、実際のHTTPリクエストが単一部分のインラインMTOMメッセージに変更されることです。
@Override
public boolean handleMessage(MessageHandlerContext context) {
HttpTransportPipe.dump = true;
Boolean isOutgoing = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutgoing) {
System.out.println("\nOutbound message:");
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
context.getMessage().writeTo(writer);
} catch (XMLStreamException e) {
throw new IllegalStateException("Unable to write");
}
} else {
System.out.println("\nInbound message:");
}
return true;
}