13.5.2. JAX-WS 共通 API の参考資料
ハンドラーフレームワークは JAX-WS プロトコルバインディングにより、サーバーコンポーネントであるクライアントおよびエンドポイントのランタイムに実装されます。プロキシおよび Dispatch のインスタンスは、バインディングプロバイダー と総称されており、それぞれがプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。
メッセージハンドラーのタイプ
- 論理ハンドラー
- 論理ハンドラーはメッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコルに依存しないため、メッセージのプロトコル固有の部分は影響を受けません。論理ハンドラーはインターフェース
javax.xml.ws.handler.LogicalHandlerを実装します。 - プロトコルハンドラー
- プロトコルハンドラーはメッセージコンテキストおよびプロトコル固有のメッセージでのみ動作します。プロトコルハンドラーは特定のプロトコルに固有で、プロトコル固有のメッセージアスペクトにアクセスし、変更することが可能です。 プロトコルハンドラーは
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandlerから派生する任意のインターフェースを実装します。 - サービスエンドポイントハンドラー
- サービスエンドポイントでは、ハンドラーは
@HandlerChainアノテーションを使用して定義されます。ハンドラーチェーンファイルの場所は、externalForm内の絶対java.net.URL、あるいはソースファイルまたはクラスファイルからの相対パスで指定できます。例13.30 サービスエンドポイントハンドラーの例
@WebService @HandlerChain(file = "jaxws-server-source-handlers.xml") public class SOAPEndpointSourceImpl { ... } - サービスクライアントハンドラー
- JAX-WS クライアントでは、ハンドラーは サービスエンドポイント同様に
@HandlerChainアノテーションを使用するか、動的に JAX-WS API を使用して定義します。例13.31 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);setHandlerChainメソッドへの呼び出しが必要です。
MessageContext インターフェースは、全 JAX-WS メッセージコンテキスト用のスーパーインターフェースです。追加のメソッドと定数を使用して Map<String,Object> を拡張し、ハンドラーチェーン内のハンドラーが処理関連の状態を共有できるようにするプロパティーセットを管理します。たとえば、ハンドラーは put メソッドを使用してメッセージコンテキストにプロパティーを挿入することができます。その後、ハンドラーチェーン内の単一または複数のハンドラーは、get メソッドでメッセージを取得できるようになります。
APPLICATION または HANDLER としてスコープ指定されます。特定のエンドポイントのメッセージ交換パターン (MEP) のインスタンスに対するハンドラーには、すべてのプロパティーを使用できます。たとえば、論理ハンドラーがメッセージコンテキストにプロパティーを追加すると、MET インスタンスの実行中にチェーンの任意のプロトコルハンドラーもそのプロパティーを使用できます。
注記
APPLICATION レベルにスコープ指定されているプロパティーは、クライアントアプリケーションとサービスエンドポイントの実装でも使用できます。プロパティーの defaultscope は HANDLER です。
- 論理メッセージコンテキスト
- 論理ハンドラーが呼び出されると、タイプ
LogicalMessageContextのメッセージコンテキストを受信します。LogicalMessageContextは、メッセージペイロードを取得および変更するメソッドを使用してMessageContextを拡張します。これは、メッセージのプロトコル固有の部分へのアクセスは提供しません。プロトコルバインディングは、論理メッセージコンテキストを介して使用可能なメッセージコンポーネントを定義します。SOAP バインディングにデプロイされている論理ハンドラーは、SOAP ボディーのコンテンツにアクセス可能ですが、SOAP ヘッダーにはアクセスできません。一方、XML/HTTP バインディングは論理ハンドラーがメッセージの XML ペイロード全体にアクセスできることを定義します。 - SOAP メッセージコンテキスト
- SOAP ハンドラーが呼び出されると、
SOAPMessageContextを受信します。SOAPMessageContextは SOAP メッセージペイロードを取得および変更するメソッドを使用してMessageContextを拡張します。
アプリケーションは、SOAPFaultException またはアプリケーション固有のユーザー例外をスローすることがあります。アプリケーション固有のユーザー例外がスローされ、必要なフォールトラッパー (fault wrapper) Bean がデプロイメントの一部となっていない場合は、起動時に生成されます。
例13.32 フォールトハンドリングの例
public void throwSoapFaultException()
{
SOAPFactory factory = SOAPFactory.newInstance();
SOAPFault fault = factory.createFault("this is a fault string!", new QName("http://foo", "FooCode"));
fault.setFaultActor("mr.actor");
fault.addDetail().addChildElement("test");
throw new SOAPFaultException(fault);
}
public void throwApplicationException() throws UserException
{
throw new UserException("validation", 123, "Some validation error");
}
JAX-WS API で使用可能なアノテーションは JSR-224 で定義されています。この定義は http://www.jcp.org/en/jsr/detail?id=224 に記載されています。これらのアノテーションは javax.xml.ws パッケージに含まれています。
javax.jws パッケージに含まれています。