16.6.2. JAX-WS Common API Reference
ハンドラーフレームワーク
ハンドラーフレームワークは、クライアントおよびエンドポイント (サーバーコンポーネント) の JAX-WS プロトコルバインディングによって実装されます。binding providers として知られるプロキシーおよび Dispatch
インスタンスは、それぞれプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。
メッセージハンドラーの種類
- 論理ハンドラー
- Logical handlers は、メッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコルに依存しないため、メッセージのプロトコル固有の部分には影響がありません。論理ハンドラーはインターフェイスを実装します
javax.xml.ws.handler.LogicalHandler
。 - プロトコルハンドラー
- Protocol handlers は、メッセージコンテキストプロパティーおよびプロトコル固有のメッセージで動作します。プロトコルハンドラーは特定のプロトコルに固有のもので、メッセージのプロトコル固有の側面にアクセスし、変更する可能性があります。プロトコルハンドラーは、から派生した任意のインターフェイスを実装します
javax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandler
。 - サービスエンドポイントハンドラー
- サービスエンドポイントでは、ハンドラーは
@HandlerChain
注釈。ハンドラーチェーンファイルの場所は、絶対的なものにすることができますjava.net.URL
のexternalForm
または、ソースファイルまたはクラスファイルからの相対パス。例16.30 サービスエンドポイントハンドラーの例
@WebService @HandlerChain(file = "jaxws-server-source-handlers.xml") public class SOAPEndpointSourceImpl { ... }
- サービスクライアントハンドラー
- JAX-WS クライアントでは、ハンドラーはサービスエンドポイントの場合と同様に
@HandlerChain
アノテーションを使用するか、JAX-WS API を使用して動的に定義されます。例16.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
メソッドが必要です。
メッセージコンテキスト
TheMessageContext
interface は、すべての JAX-WS メッセージコンテキストのスーパーインターフェイスです。これは、追加のメソッドと定数を使用して Map<String,Object>
を拡張し、ハンドラーチェーンのハンドラーが処理関連の状態を共有できるようにするプロパティーセットを管理します。たとえば、ハンドラーは put
メソッドを使用してプロパティーをメッセージコンテキストに挿入します。ハンドラーチェーン内の他の 1 つ以上のハンドラーは、その後、get
方法。
APPLICATION
または HANDLER
としてスコープ指定されます。すべてのプロパティーは、特定のエンドポイントのメッセージ交換パターン (MEP) のインスタンスに対するすべてのハンドラーで利用できます。たとえば、論理ハンドラーがプロパティーをメッセージコンテキストに置いた場合、そのプロパティーは MEP インスタンスの実行中にチェーンの任意のプロトコルハンドラーでも利用できます。
APPLICATION
レベルでスコープ設定されているプロパティーは、クライアントアプリケーションおよびサービスエンドポイント実装でも利用可能になります。Thedefaultscope
プロパティーの場合は HANDLER
です。
- 論理メッセージコンテキスト
- 論理ハンドラーが呼び出されると、タイプのメッセージコンテキストを受け取ります
LogicalMessageContext
。LogicalMessageContext
拡張しますMessageContext
メッセージペイロードを取得および変更するメソッドを使用します。メッセージのプロトコル固有の側面へのアクセスは提供しません。プロトコルバインディングは、論理メッセージコンテキストを介して使用できるメッセージのコンポーネントを定義します。SOAP バインディングにデプロイされた論理ハンドラーは SOAP ボディーのコンテンツにアクセスできますが、SOAP ヘッダーにはアクセスできません。一方、XML/HTTP バインディングは論理ハンドラーがメッセージの XML ペイロード全体にアクセスできることを定義します。 - SOAP メッセージコンテキスト
- SOAP ハンドラーが呼び出されると、
SOAPMessageContext
。SOAPMessageContext
拡張しますMessageContext
SOAP メッセージペイロードを取得および変更するメソッドを使用します。
障害処理
アプリケーションが SOAPFaultException
またはアプリケーション固有のユーザー例外をスローする可能性があります。後者の場合、必要な障害ラッパー Bean がデプロイメントに含まれていない場合は、ランタイム時に生成されます。
例16.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 アノテーション
JAX-WS API 経由で利用可能なアノテーションは JSR-224 で定義されています。これについては、を参照してください http://www.jcp.org/en/jsr/detail?id=224。これらの注釈はパッケージに含まれていますjavax.xml.ws
。
javax.jws
。