9.17. 共通 API

本項は Web サービスエンドポイントWeb サービスクライアント に同等に当てはまる概念について説明しています。

9.17.1. ハンドラーフレームワーク

ハンドラーフレームワークは JAX-WS プロトコルバインディングによってクライアントおよびサーバー側両方のランタイムで実装されます。 バインディングプロバイダーとして集合的に知られるプロキシおよび Dispatch インスタンスはそれぞれプロトコルバインディングを使ってその抽出機能を特定のプロトコルにバインドします。
クライアントおよびサーバー側ハンドラーはハンドラーチェーンとして知られる順序付けされた一覧に並べられます。 ハンドラーチェーン内のハンドラ群はメッセージが送信または受信される度に呼び出されます。 インバウンドメッセージはバインディングプロバイダー処理の前に処理されます。 アウトバウンドメッセージはあらゆるバインディングプロバイダー処理の後に処理されます。
ハンドラーは、 インバウンドメッセージとアウトバウンドメッセージにアクセスして編集、 およびプロパティセットの管理を行うメソッドを提供するメッセージコンテキストで呼び出されます。 メッセージコンテキストのプロパティはハンドラー間での通信やハンドラーとクライアントおよびサービス実装間での通信を容易にするために使用することができます。 異なるメッセージコンテキストタイプで異なるタイプのハンドラーが呼び出されます。

9.17.1.1. 論理ハンドラー

メッセージコンテキストプロパティおよびメッセージペイロードでのみ動作するハンドラです。 論理ハンドラーはプロトコルにとらわれないため、 メッセージのプロトコル固有部分には作用できません。 論理ハンドラーは javax.xml.ws.handler.LogicalHandler を実装するハンドラーになります。

9.17.1.2. プロトコルハンドラー

メッセージコンテキストプロパティおよびプロトコル固有メッセージでのみ動作するハンドラです。 プロトコルハンドラは特定のプロトコルに固有となるため、 メッセージのプロトコル特定部分にアクセスして変更することができます。 プロトコルハンドラーは javax.xml.ws.handler.LogicalHandler 以外の javax.xml.ws.handler.Handler から生じたあらゆるインターフェースを実装するハンドラーになります。

9.17.1.3. サービスエンドポイントのハンドラー

サービスエンドポイントで、 ハンドラーは @HandlerChain アノテーションを使って定義されます。
@WebService
@HandlerChain(file = "jaxws-server-source-handlers.xml")
public class SOAPEndpointSourceImpl
{
...
}
ハンドラーチェーンファイルの場所は 2 種類の形式に対応しています。
1. externalForm での完全な java.net.URL。 (例、 http://myhandlers.foo.com/handlerfile1.xml)
2. ソースファイルまたはクラスファイルからの相対パス。 (例、 bar/handlerfile1.xml)

9.17.1.4. サービスクライアントのハンドラー

クライアント側で、 ハンドラーは SEI で @HandlerChain アノテーションを使用して、 あるいは API を使って動的に設定することができます。
Service service = Service.create(wsdlURL, serviceName);
Endpoint port = (Endpoint)service.getPort(Endpoint.class);
  
BindingProvider bindingProvider = (BindingProvider)port;
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(new LogHandler());
handlerChain.add(new AuthorizationHandler());
handlerChain.add(new RoutingHandler());
bindingProvider.getBinding().setHandlerChain(handlerChain); // important!