Web サービス・アドレッシング (WS-Addressing) は、Web サービスをアドレス指定してメッセージ内でアドレッシング情報を提供するための標準の方法を定義することで、Web サービス間のインターオペラビリティーを補助します。このタスクでは、WS-Addressing エンドポイント参照を使用してアクセスされる JAX-WS Web サービスを作成するために必要なステップを説明します。
このタスクはまた、Web サービスの一部としてステートフル・リソースを使用するために必要な追加のステップも説明しています。
始める前に
このタスクで説明されているステップは、WebSphere® Application Server 上で実行されるサーバーおよびクライアントに適用されます。
このタスクについて
このタスクは、WS-Addressing 仕様を使用する JAX-WS Web サービスを作成する場合に実行します。
このタスクでは、JAX-WS WS-Addressing
API を使用して、必要なエンドポイント参照を作成します。また、IBM 所有の WS-Addressing API を使用してエンドポイント参照を作成し、アプリケーションの残りの部分で使用できるように、そのエンドポイント参照を JAX-WS API オブジェクトに変換することができます。
手順
- エンドポイント参照をターゲット・サービスに戻す Web サービス・インターフェースを提供します。
インターフェースは、ファクトリー・オペレーションまたは別々のファクトリー・サービスを使用することによって可能になるエンドポイント参照の戻しを行う必要があります。
ターゲット・サービスはリソース・インスタンス (例えばショッピング・カート) に面することができます。
- 前のステップで作成した Web サービスを実装します。実装の WS-Addressing 部分に対して、以下のステップを実行します。
- オプション: WS-Addressing の振る舞いを指定するアノテーションを組み込みます。
詳しくは
、Web サービス・アドレッシングのアノテーション を参照してください。
- オプション: ご使用のインターフェースが、リソース・インスタンスを渡す Web サービスを呼び出す場合、リソース・インスタンスを作成または検索します。
- オプション: リソース・インスタンスを使用している場合は、リソースの ID を取得します。 リソース ID はアプリケーション依存で、リソース・インスタンスの作成中に生成されます。
重要: リソース ID は SOAP メッセージに含めて伝搬されるため、リソース ID 内に機密情報を書き込んではなりません。
- JAX-WS Web サービス・アドレッシング API を使用したエンドポイント参照の作成の指示に従って、Web サービスを参照するエンドポイント参照を作成します。リソース・インスタンスを使用している場合は、リソース ID をパラメーターとして渡します。
- エンドポイント参照を戻します。
- Web サービスがリソース・インスタンスを使用している場合は、実装を拡張して、着信メッセージが適切なリソース・インスタンスと一致するようにします。 リソース ID を前に作成したエンドポイント参照と関連付けたので、そのエンドポイント参照でターゲットされた着信メッセージはどれも、メッセージの SOAP ヘッダー内の参照パラメーターとしてリソース ID 情報を含んでいます。
リソース ID は SOAP ヘッダーで受け渡されるため、それを Web サービス・インターフェース上で公開する必要はありません。WebSphere Application Server はメッセージを受信したとき、スレッド上のメッセージ・コンテキスト内にこの情報を書き込みます。
実装を拡張して、以下のアクションを実行します。
- メッセージ・コンテキストからリソース・インスタンス ID を取得します。
- 2005/08 WS-Addressing 名前空間を使用している場合は、MessageContext クラスの REFERENCE_PARAMETERS プロパティーを使用します。
- 2004/08 WS-Addressing 名前空間を使用している場合は、IBM WS-Addressing API、具体的には EndpointReferenceManager.getReferenceParameterFrom
MessageContext(QName resource_id) メソッドを使用する必要があります。
2005/08 名前空間では以下のメソッドを使用します。...
List resourceIDList = (List)getContext().getMessageContext().get(MessageContext.REFERENCE_PARAMETERS);
...
2004/08 名前空間では以下のメソッドを使用します。...
String resource_identifier =
EndpointReferenceManager.getReferenceParameterFromMessageContext(PRINTER_ID_PARAM_QNAME);
...
- メッセージを適切なリソース・インスタンスに転送します。
- オプション: サービスと通信するように、プロキシー・クライアントを構成します。
- wsimport または xjc ツールを使用して、クライアントが要求する成果物を生成します。
注: 2004/08 WS-Addressing 仕様を使用する場合は、提供されるバインディング・ファイル app_server_root/util/SubmissionEndpointReference.xjb をツールの -b パラメーターとして指定します。このパラメーターは、標準の JAX-WS API の IBM 実装の一部である SubmissionEndpointReference クラスを使用してエンドポイント参照オブジェクトを生成するように、ツールに指示します。
このバインディング・ファイルを指定しなければ、生成されるエンドポイント参照オブジェクトは 標準 JAX-WS API で動作しません。
- クライアント・コードで、サービス・クラスのインスタンスを作成します。
- サービス・クラスから、プロキシー・オブジェクトを取得します。 JAX-WS API を使用してプロキシー・オブジェクトを取得する方法は、いくつかあります。例えば、Service クラスには複数の getPort メソッドがあり、EndpointReference クラスには 1 つの getPort メソッドがあります。
詳しくは、API の資料を参照してください。
- オプション: Addressing または SubmissionAddressing フィーチャーを使用して、WS-Addressing サポートを使用可能にします。 例えば、Web サービス・フィーチャーをパラメーターとして受け取る getPort メソッドを使用して、プロキシーを作成します。
必要であれば、ポリシー・セットなどの別の方法を使用して、WS-Addressing サポートを使用可能にすることができます。
詳しくは、JAX-WS アプリケーションに対する Web サービス・アドレッシング・サポートの使用可能化を参照してください。
- プロキシー・オブジェクトを使用して、エンドポイント参照を戻すサービス・メソッドを呼び出します。
以下のサンプル・コードは、クライアントが Web サービスを呼び出し、2 つの数値を一緒に追加している例を示しています。Web サービスはクライアントにチケット (リソース ID) を発行し、Web サービスを呼び出すときにクライアントがこのチケットを使用するように要求します。
このクライアントは 2 つのプロキシーを作成します。最初のプロキシーにより、サービスからのエンドポイント参照としてチケットが取得されます。
2 番目のプロキシーは、AddressingFeature クラスを使用して 2005/08 仕様に対応した WS-Addressing を使用可能にし、これらの 2 つの数値を一緒に追加するサービスを呼び出します。
...
CalculatorService service = new CalculatorService();
// Create the first proxy
Calculator port1 = service.getCalculatorServicePort();
// Obtain the ticket as an endpoint reference from the service
W3CEndpointReference epr = port1.getTicket();
// Create the second proxy, using an addressing feature to enable WS-Addressing
Calculator port2 = epr.getPort(Calculator.class, new AddressingFeature());
// Invoke the service to add the numbers
int answer = port2.add(value0, value1);
System.out.println("The answer is: " + answer);
...
注: エンドポイント参照のメタデータがアウトバウンド・メッセージと既に関連付けられている情報と競合する場合、例えば、プロキシー・オブジェクトが異なるインターフェースを表すように構成されている場合、エンドポイントの呼び出しを試みると、javax.xml.ws.WebServiceException 例外がスローされます。
エンドポイントへの応答などに message-addressing プロパティーを設定する場合は、IBM 専有の Web Services Addressing SPI を使用したメッセージ・アドレッシング・プロパティーの指定と獲得で説明されているように、IBM 所有の WS-Addressing SPI および BindingProvider クラスを使用する必要があります。
- オプション: サービスと通信するように、ディスパッチ・クライアントを構成します。 クライアントはさまざまな方法で構成することができます。以下のステップは、その一例を示しています。
- サービスのインスタンスを作成します。
- サービス・オブジェクトにポートを追加します。
- エンドポイント参照を渡して、Dispatch クラスのインスタンスを作成します。
- ディスパッチ・オブジェクトを作成します。 以下のパラメーターを指定して Service.createDispatch メソッドを使用します。
Service.createDispatch メソッドにはさまざまな種類があります。詳しくは、API 資料を参照してください。
- クライアント要求メッセージを作成します。
- ディスパッチ・クライアントを使用して、サービス・エンドポイントを呼び出します。
以下のコードは、2004/08 WS-Addressing を使用可能にするディスパッチ・クライアントのフラグメントの例です。...
CalculatorService service = new CalculatorService();
Dispatch(<SOAPMessage> dispatch = service.createDispatch(
endpointReference,
SOAPMessage.class,
Service.Mode.MESSAGE,
new SubmissionAddressingFeature(true));
...