42.3. コンシューマー実装でのコンテキストの操作

概要

コンシューマー実装は、BindingProvider インターフェイスを介してコンテキスト情報にアクセスできます。BindingProvider インスタンスは、次の 2 つの別個のコンテキストでコンテキスト情報を保持します。

  • リクエストコンテキスト リクエストコンテキスト を使用すると、アウトバウンドメッセージに影響を与えるプロパティーを設定できます。リクエストコンテキストプロパティーは特定のポートインスタンスに適用され、一度設定されると、プロパティーが明示的にクリアされるまで、プロパティーはポートで行われる後続のすべての操作呼び出しに影響します。たとえば、リクエストコンテキストプロパティーを使用して、接続タイムアウトを設定したり、ヘッダーで送信するためのデータを初期化したりできます。
  • 応答コンテキスト 応答コンテキスト を使用すると、現在のスレッドから行われた最後の操作呼び出しへの応答によって設定されたプロパティー値を読み取ることができます。応答コンテキストのプロパティーは、操作が呼び出されるたびにリセットされます。たとえば、応答コンテキストプロパティーにアクセスして、最後の受信メッセージから受信したヘッダー情報を読み取ることができます。
重要

コンシューマー実装は、メッセージコンテキストのアプリケーションスコープに配置されている情報にのみアクセスできます。

コンテキストの取得

コンテキストは、javax.xml.ws.BindingProvider インターフェイスを使用して取得されます。BindingProvider インターフェイスには、コンテキストを取得するための 2 つのメソッドがあります。

  • getRequestContext() 例42.7「getRequestContext() メソッド」に示されている getRequestContext() メソッドは、リクエストコンテキストを Map オブジェクトとして返します。返される Map オブジェクトを使用して、コンテキストの内容を直接操作できます。

    例42.7 getRequestContext() メソッド

    Map<String, Object>getRequestContext

  • getResponseContext() 例42.8「getResponseContext() メソッド」に示されている getResponseContext() は、応答コンテキストを Map オブジェクトとして返します。返される Map オブジェクトの内容は、現在のスレッドで行われたモートサービスで最後に成功したリクエストからの応答コンテキストの内容の状態を反映しています。

    例42.8 getResponseContext() メソッド

    Map<String, Object>getResponseContext

プロキシーオブジェクトは BindingProvider インターフェイスを実装しているため、BindingProvider オブジェクトはプロキシーオブジェクトをキャストすることで取得できます。BindingProvider オブジェクトから取得されたコンテキストは、それを作成するために使用されたプロキシーオブジェクトで呼び出された操作に対してのみ有効です。

例42.9「コンシューマーの要求コンテキストの取得」 プロキシーのリクエストコンテキストを取得するためのコードを示しています。

例42.9 コンシューマーの要求コンテキストの取得

// Proxy widgetProxy obtained previously
BindingProvider bp = (BindingProvider)widgetProxy;
Map<String, Object> requestContext = bp.getRequestContext();

コンテキストからのプロパティーの読み取り

コンシューマーコンテキストは java.util.Map<String, Object> オブジェクトに保存されます。マップは、String オブジェクトであるキーと任意のオブジェクトが含まれる値を持ちます。応答コンテキストプロパティーのマッピングにあるエントリーにアクセスするには、java.util.Map.get() を使用します。

特定のコンテキストプロパティー ContextPropertyName を取得するには、例42.10「応答コンテキストプロパティーの読み取り」 のコードを使用します。

例42.10 応答コンテキストプロパティーの読み取り

// Invoke an operation.
port.SomeOperation();

// Read response context property.
java.util.Map<String, Object> responseContext =
  ((javax.xml.ws.BindingProvider)port).getResponseContext();
PropertyType propValue = (PropertyType) responseContext.get(ContextPropertyName);

コンテキストでのプロパティーの設定

コンシューマーコンテキストは、java.util.Map<String, Object> オブジェクトに保存されるハッシュマップです。マップには、String オブジェクトであるキーと任意のオブジェクトである値が含まれます。コンテキストのプロパティーを設定するには、java.util.Map.put() メソッドを使用します。

要求コンテキストと応答コンテキストの両方でプロパティーを設定できますが、メッセージ処理に影響を与えるのは要求コンテキストに加えられた変更のみです。応答コンテキストのプロパティーは、現在のスレッドで各リモート呼び出しが完了するとリセットされます。

例42.11「リクエストコンテキストプロパティーの設定」 に示すコードは、BindingProvider.ENDPOINT_ADDRESS_PROPERTY の値を設定して、ターゲットサービスプロバイダーのアドレスを変更します。

例42.11 リクエストコンテキストプロパティーの設定

// Set request context property.
java.util.Map<String, Object> requestContext =
     ((javax.xml.ws.BindingProvider)port).getRequestContext();
requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://localhost:8080/widgets");

// Invoke an operation.
port.SomeOperation();
重要

プロパティーがリクエストコンテキストに設定されると、その値は後続のすべてのリモート呼び出しに使用されます。値を変更すると、変更した値が使用されます。

サポートされているコンテキスト

Apache CXF は、コンシューマー実装で次のコンテキストプロパティーをサポートします。

表42.2 コンシューマーコンテキストのプロパティー

プロパティー名説明

javax.xml.ws.BindingProvider

ENDPOINT_ADDRESS_PROPERTY

ターゲットサービスのアドレスを指定します。この値は String として保存されます。

USERNAME_PROPERTY[a]

HTTP 基本認証に使用されるユーザー名を指定します。この値は String として保存されます。

PASSWORD_PROPERTY[b]

HTTP 基本認証に使用されるパスワードを指定します。この値は String として保存されます。

SESSION_MAINTAIN_PROPERTY[c]

クライアントがセッション情報を維持するかどうかを指定します。この値は Boolean オブジェクトとして保存されます。

org.apache.cxf.ws.addressing.JAXWSAConstants

CLIENT_ADDRESSING_PROPERTIES

コンシューマーが目的のサービスプロバイダーに連絡するために使用する WS-Addressing 情報を指定します。この値は org.apache.cxf.ws.addressing.AddressingProperties として保存されます。

org.apache.cxf.transports.jms.context.JMSConstants

JMS_CLIENT_REQUEST_HEADERS

メッセージの JMS ヘッダーが含まれます。詳細は、「JMS メッセージプロパティーの操作」 を参照してください。

[a] このプロパティーは、HTTP セキュリティー設定で定義されたユーザー名によって上書きされます。
[b] このプロパティーは、HTTP セキュリティー設定で定義されたパスワードによって上書きされます。
[c] Apache CXF はこのプロパティーを無視します。