43.10. ハンドラーを使用するためのエンドポイントの設定

43.10.1. プログラムによる設定

43.10.1.1. コンシューマーへのハンドラーチェーンの追加

概要

ハンドラーチェーンをコンシューマーに追加するには、ハンドラーのチェーンを明示的に構築する必要があります。その後、サービスプロキシーの Binding オブジェクトにハンドラーチェーンを直接設定します。

重要

Spring の設定を使用して設定されたハンドラーチェーンは、プログラムで設定されたハンドラーチェーンをオーバーライドします。

手順

ハンドラーチェーンをコンシューマーに追加するには、次のようにします。

  1. ハンドラーチェーンを保持する List<Handler> オブジェクトを作成します。
  2. チェーンに追加される各ハンドラーのインスタンスを作成します。
  3. インスタンス化された各ハンドラーオブジェクトを、ランタイムによって呼び出される順序でリストに追加します。
  4. サービスプロキシーから Binding オブジェクトを取得します。

    Apache CXF は、org.apache.cxf.jaxws.binding.DefaultBindingImpl というバインディングインターフェイスの実装を提供します。

  5. Binding オブジェクトの setHandlerChain() メソッドを使用して、プロキシーにハンドラーチェーンを設定します。

例43.14「コンシューマーへのハンドラーチェーンの追加」 は、ハンドラーチェーンをコンシューマーに追加するためのコードを示しています。

例43.14 コンシューマーへのハンドラーチェーンの追加

import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.Handler;
import java.util.ArrayList;
import java.util.List;

import org.apache.cxf.jaxws.binding.DefaultBindingImpl;
...
SmallNumberHandler sh = new SmallNumberHandler();
List<Handler> handlerChain = new ArrayList<Handler>();
handlerChain.add(sh);

DefaultBindingImpl binding = ((BindingProvider)proxy).getBinding();
binding.getBinding().setHandlerChain(handlerChain);

例43.14「コンシューマーへのハンドラーチェーンの追加」 のコードは、以下を行います。

ハンドラーをインスタンス化します。

チェーンを保持する List オブジェクトを作成する。

ハンドラーをチェーンに追加します。

Binding オブジェクトを DefaultBindingImpl オブジェクトとしてプロキシーから取得する。

ハンドラーチェーンをプロキシーのバインディングに割り当てます。

43.10.1.2. サービスプロバイダーへのハンドラーチェーンの追加

概要

SEI または実装クラスのいずれかに @HandlerChain アノテーションを付けて、ハンドラーチェーンをサービスプロバイダーに追加します。注釈は、サービスプロバイダーが使用するハンドラーチェーンを定義するメタデータファイルを指します。

手順

ハンドラーチェーンをサービスプロバイダーに追加するには、次のようにします。

  1. プロバイダーの実装クラスに @HandlerChain アノテーションを付けます。
  2. ハンドラーチェーンを定義するハンドラー設定ファイルを作成します。
@HandlerChain アノテーション

javax.jws.HandlerChain アノテーションは、サービスプロバイダーの実装クラスに付けられます。アノテーションは、その file プロパティーで指定されたハンドラーチェーンの設定ファイルを読み込むようにランタイムに指示します。

アノテーションの file プロパティーは、読み込むハンドラーの設定ファイルを識別する 2 つの方法をサポートします。

  • a URL
  • 相対パス名

例43.15「ハンドラーチェーンをロードするサービスの実装」に、handlers.xml と呼ばれるファイルに定義されたハンドラーチェーンを使用するサービスプロバイダーの実装を示します。handlers.xml は、サービスプロバイダーが実行されるディレクトリーに存在する必要があります。

例43.15 ハンドラーチェーンをロードするサービスの実装

import javax.jws.HandlerChain;
import javax.jws.WebService;
...

@WebService(name = "AddNumbers",
            targetNamespace = "http://apache.org/handlers",
            portName = "AddNumbersPort",
            endpointInterface = "org.apache.handlers.AddNumbers",
            serviceName = "AddNumbersService")
@HandlerChain(file = "handlers.xml")
public class AddNumbersImpl implements AddNumbers
{
...
}
ハンドラー設定ファイル

ハンドラー設定ファイルは、JSR 109 (Web Services for Java EE、バージョン 1.2) に付属する XML 文法を使用してハンドラーチェーンを定義します。この文法は http://java.sun.com/xml/ns/javaee で定義されます。

ハンドラー設定ファイルのルート要素は、handler-chains 要素です。handler-chains 要素には、1 つまたは複数の handler-chain 要素があります。

handler-chain 要素は、ハンドラーチェーンを定義します。表43.1「サーバーサイドハンドラーチェーンの定義に使用される要素」で、handler-chain 要素の子を説明します。

表43.1 サーバーサイドハンドラーチェーンの定義に使用される要素

要素説明

handler

ハンドラーを説明する要素が含まれています。

service-name-pattern

ハンドラーチェーンがバインドされるサービスを定義する WSDL service 要素の QName を指定します。QName を定義する際に、* をワイルドカードとして使用できます。

port-name-pattern

ハンドラーチェーンがバインドされるエンドポイントを定義する WSDL port 要素の QName を指定します。QName を定義する際に、* をワイルドカードとして使用できます。

protocol-binding

ハンドラーチェーンが使用されるメッセージバインディングを指定します。バインディングは、URI として指定するか、#\#SOAP11_HTTP\##SOAP11_HTTP_MTOM\##SOAP12_HTTP\##SOAP12_HTTP_MTOM、または \#\#XML_HTTP のエイリアスのいずれかを使用して指定します。

メッセージバインディング URI の詳細については、23章Apache CXF バインディング ID を参照してください。

handler-chain 要素に必要なのは、子要素としての handler 1 つだけです。ただし、完全なハンドラーチェーンを定義するのに、handler 要素を必要な数だけサポートします。チェーン内のハンドラーは、ハンドラーチェーン定義で指定された順序で実行されます。

重要

最終的な実行順序は、指定されたハンドラーを論理ハンドラーとプロトコルハンドラーに分類することによって決定されます。グループ内では、設定で指定された順序が使用されます。

protocol-binding などの他の子は、定義されたハンドラーチェーンのスコープを制限するために使用されます。たとえば、service-name-pattern 要素を使用する場合、ハンドラーチェーンは WSDL port 要素が指定の WSDL service 要素の子であるサービスプロバイダーにのみ割り当てられます。handler 要素では、これらの制限用の子の 1 つしか使用できません。

handler 要素は、ハンドラーチェーンの個々のハンドラーを定義します。handler-class 子要素は、ハンドラーを実装するクラスの完全修飾名を指定します。handler 要素は、ハンドラーに一意の名前を指定するオプションの handler-name 要素を持つこともできます。

例43.16「ハンドラー設定ファイル」 は、単一のハンドラーチェーンを定義するハンドラー設定ファイルを示しています。チェーンは 2 つのハンドラーで設定されています。

例43.16 ハンドラー設定ファイル

<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://java.sun.com/xml/ns/javaee">
  <handler-chain>
    <handler>
      <handler-name>LoggingHandler</handler-name>
      <handler-class>demo.handlers.common.LoggingHandler</handler-class>
    </handler>
    <handler>
      <handler-name>AddHeaderHandler</handler-name>
      <handler-class>demo.handlers.common.AddHeaderHandler</handler-class>
    </handler>
  </handler-chain>
</handler-chains>