Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

16.6.2. JAX-WS Common API Reference

JAX-WS の開発概念は、Web サービスのエンドポイントとクライアント間で共有されています。これには、ハンドラーフレームワーク、メッセージコンテキスト、および障害処理が含まれます。

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

ハンドラーフレームワークは、クライアントおよびエンドポイント (サーバーコンポーネント) の JAX-WS プロトコルバインディングによって実装されます。binding providers として知られるプロキシーおよび Dispatch インスタンスは、それぞれプロトコルバインディングを使用して抽象機能を特定のプロトコルにバインドします。

クライアントおよびサーバー側のハンドラーは、handler chain と呼ばれる順序付けされたリストに編成されます。ハンドラーチェーン内のハンドラーは、メッセージが送受信されるたびに呼び出されます。受信メッセージは、バインディングプロバイダーが処理する前にハンドラーによって処理されます。アウトバウンドメッセージは、バインディングプロバイダーが処理した後にハンドラーによって処理されます。
ハンドラーは、受信メッセージおよびアウトバウンドメッセージにアクセスして変更し、プロパティーのセットを管理するメソッドを提供するメッセージコンテキストで呼び出されます。メッセージコンテキストプロパティーは、ハンドラーとクライアントおよびサービスの実装間の通信だけでなく、個別のハンドラー間の通信を容易にします。異なるタイプのハンドラーは異なるタイプのメッセージコンテキストで呼び出されます。

メッセージハンドラーの種類

論理ハンドラー
Logical handlers は、メッセージコンテキストプロパティーおよびメッセージペイロードでのみ動作します。論理ハンドラーはプロトコルに依存しないため、メッセージのプロトコル固有の部分には影響がありません。論理ハンドラーはインターフェイスを実装しますjavax.xml.ws.handler.LogicalHandler
プロトコルハンドラー
Protocol handlers は、メッセージコンテキストプロパティーおよびプロトコル固有のメッセージで動作します。プロトコルハンドラーは特定のプロトコルに固有のもので、メッセージのプロトコル固有の側面にアクセスし、変更する可能性があります。プロトコルハンドラーは、から派生した任意のインターフェイスを実装しますjavax.xml.ws.handler.Handler except javax.xml.ws.handler.LogicalHandler
サービスエンドポイントハンドラー
サービスエンドポイントでは、ハンドラーは@HandlerChain注釈。ハンドラーチェーンファイルの場所は、絶対的なものにすることができますjava.net.URLexternalFormまたは、ソースファイルまたはクラスファイルからの相対パス。

例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メソッドが必要です。

メッセージコンテキスト

TheMessageContextinterface は、すべての JAX-WS メッセージコンテキストのスーパーインターフェイスです。これは、追加のメソッドと定数を使用して Map<String,Object> を拡張し、ハンドラーチェーンのハンドラーが処理関連の状態を共有できるようにするプロパティーセットを管理します。たとえば、ハンドラーは put メソッドを使用してプロパティーをメッセージコンテキストに挿入します。ハンドラーチェーン内の他の 1 つ以上のハンドラーは、その後、get方法。

プロパティーは APPLICATION または HANDLER としてスコープ指定されます。すべてのプロパティーは、特定のエンドポイントのメッセージ交換パターン (MEP) のインスタンスに対するすべてのハンドラーで利用できます。たとえば、論理ハンドラーがプロパティーをメッセージコンテキストに置いた場合、そのプロパティーは MEP インスタンスの実行中にチェーンの任意のプロトコルハンドラーでも利用できます。
注記
非同期メッセージ交換パターン (MEP) を使用すると、HTTP 接続レベルでメッセージを非同期に送受信できます。これを有効にするには、要求コンテキストに追加のプロパティーを設定します。
APPLICATION レベルでスコープ設定されているプロパティーは、クライアントアプリケーションおよびサービスエンドポイント実装でも利用可能になります。Thedefaultscopeプロパティーの場合は HANDLER です。
論理メッセージと SOAP メッセージは、異なるコンテキストを使用します。
論理メッセージコンテキスト
論理ハンドラーが呼び出されると、タイプのメッセージコンテキストを受け取りますLogicalMessageContextLogicalMessageContext 拡張しますMessageContextメッセージペイロードを取得および変更するメソッドを使用します。メッセージのプロトコル固有の側面へのアクセスは提供しません。プロトコルバインディングは、論理メッセージコンテキストを介して使用できるメッセージのコンポーネントを定義します。SOAP バインディングにデプロイされた論理ハンドラーは SOAP ボディーのコンテンツにアクセスできますが、SOAP ヘッダーにはアクセスできません。一方、XML/HTTP バインディングは論理ハンドラーがメッセージの XML ペイロード全体にアクセスできることを定義します。
SOAP メッセージコンテキスト
SOAP ハンドラーが呼び出されると、SOAPMessageContextSOAPMessageContext 拡張しますMessageContextSOAP メッセージペイロードを取得および変更するメソッドを使用します。

障害処理

アプリケーションが 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

JWS API で利用可能なアノテーションは、にある JSR-181 で定義されてい http://www.jcp.org/en/jsr/detail?id=181 ます。これらの注釈はパッケージに含まれていますjavax.jws