ここに記載されている、使用方法SOAPHandler
を説明する回答は完全に正しいものです。SOAPHandlerはJAX-WS仕様の一部であるため、このアプローチの利点は、あらゆるJAX-WS実装で機能することです。ただし、SOAPHandlerの問題は、XMLメッセージ全体をメモリー内で暗黙的に表現しようとすることです。これにより、メモリが大量に使用される可能性があります。JAX-WSのさまざまな実装では、このための独自の回避策が追加されています。大きなリクエストや大きなレスポンスを扱う場合は、独自のアプローチの1つを検討する必要があります。
「JDK 1.5以上に含まれるもの」についてお伺いしたので、JDKに含まれているJAX-WS RI(別名Metro)と呼ばれるものについてお答えします。
JAX-WS RIにはこのための特定のソリューションがあり、メモリ使用量の点で非常に効率的です。
https://javaee.github.io/metro/doc/user-guide/ch02.html#efficient-handlers-in-jax-ws-riを参照してください。残念ながら、そのリンクは壊れていますが、WayBack Machineで見つけることができます。以下にハイライトを示します。
メトロの人々は、2007年にバック導入追加のハンドラタイプ、MessageHandler<MessageHandlerContext>
メトロ独自のものです。SOAPHandler<SOAPMessageContext>
インメモリDOM表現を行わない場合よりもはるかに効率的です。
元のブログ記事の重要なテキストは次のとおりです。
MessageHandler:
JAX-WS仕様で提供される拡張可能なハンドラーフレームワークとRIのより優れたメッセージ抽象化を利用して、(MessageContextの拡張)という新しいハンドラーを導入しました。MessageHandlerContextを通じてメッセージにアクセスし、メッセージAPIを使用してメッセージを処理できます。ブログのタイトルに書いたように、このハンドラーを使用すると、DOMベースのメッセージだけでなく、メッセージにアクセス/処理する効率的な方法を提供するメッセージを操作できます。ハンドラーのプログラミングモデルは同じで、メッセージハンドラーは標準の論理ハンドラーおよびSOAPハンドラーと組み合わせることができます。MessageHandlerを使用してメッセージをログに記録するサンプルをJAX-WS RI 2.1.3に追加しました。ここにサンプルのスニペットを示します。MessageHandler
して、Webサービスアプリケーションを拡張するために。MessageHandlerはSOAPHandlerに似ていますが、その実装は、MessageHandlerContext
public class LoggingHandler implements MessageHandler<MessageHandlerContext> {
public boolean handleMessage(MessageHandlerContext mhc) {
Message m = mhc.getMessage().copy();
XMLStreamWriter writer = XMLStreamWriterFactory.create(System.out);
try {
m.writeTo(writer);
} catch (XMLStreamException e) {
e.printStackTrace();
return false;
}
return true;
}
public boolean handleFault(MessageHandlerContext mhc) {
.....
return true;
}
public void close(MessageContext messageContext) { }
public Set getHeaders() {
return null;
}
}
(2007年のブログ投稿からの引用の終了)
言うまでもなくLoggingHandler
、この例では、カスタムハンドラーをハンドラーチェーンに追加して効果を発揮させる必要があります。これは他のを追加するのと同じなHandler
ので、このページの他の回答でその方法を確認できます。
あなたは見つけることができる完全な例ではメトロGitHubのレポを。