Menu Close

第42章 コンテキストの操作

概要

JAX-WS は、コンテキストを使用してメッセージングチェーンでメタデータを渡します。このメタデータには、そのスコープに応じて実装レベルのコードからアクセスが可能です。また、実装レベルの下にあるメッセージで動作する JAX-WS ハンドラーからもアクセスできます。

42.1. コンテキストについて

概要

多くの場合、メッセージの情報をアプリケーションの他の部分に渡す必要があります。Apache CXF は、コンテキストメカニズムを使用してこれを実施します。コンテキストは、送信または受信メッセージに関連するプロパティーを保持するマップです。コンテキストに保存されるプロパティーは、通常メッセージに関するメタデータおよびメッセージの通信に使用されるベースのトランスポートです。たとえば、HTTP レスポンスコードや JMS 相関 ID などのメッセージの送信に使用されるトランスポート固有のヘッダーは、JAX-WS コンテキストに保存されます。

コンテキストは、JAX-WS アプリケーションのすべてのレベルで利用することができます。ただし、それらはメッセージ処理スタックのどこでコンテキストにアクセスしているかによって微妙に異なります。JAX-WS Handler の実装はコンテキストに直接アクセスでき、それらで設定されるすべてのプロパティーにアクセスできます。サービス実装はコンテキストを注入することでそれらにアクセスし、APPLICATION スコープで設定されたプロパティーにのみアクセスできます。コンシューマーの実装は、APPLICATION スコープに設定されたプロパティーにのみアクセスできます。

図42.1「メッセージコンテキストおよびメッセージ処理パス」に、コンテキストプロパティーが Apache CXF を通過する方法を示します。メッセージがメッセージングチェーンを通過する際に、関連付けられたメッセージコンテキストはメッセージと共に通過します。

図42.1 メッセージコンテキストおよびメッセージ処理パス

message contexts are available through out the client and server message processing chains

プロパティーがコンテキストに保存される方法

メッセージコンテキストは、すべて javax.xml.ws.handler.MessageContext インターフェースの実装です。MessageContext インターフェースは、java.util.Map<String key, Object value> インターフェースを拡張します。マップオブジェクトは、情報をキーと値のペアとして保存します。

メッセージコンテキストでは、プロパティーは名前/値のペアとして保存されます。プロパティーのキーは、プロパティーを識別する String です。プロパティーの値は、任意の Java オブジェクトに保存される値であればどれでも構いません。値がメッセージコンテキストから返されると、アプリケーションは想定する型を認識し、適切にキャストする必要があります。たとえば、プロパティーの値が UserInfo オブジェクトに保存される場合、プロパティーの値は UserInfo オブジェクトにキャストする必要がある Object オブジェクトとしてメッセージコンテキストから返されます。

メッセージコンテキストのプロパティーにもスコープがあります。スコープは、メッセージ処理チェーンでプロパティーにアクセスできる場所を決定します。

プロパティースコープ

メッセージコンテキストのプロパティーにはスコープが設定されます。プロパティーは、以下のスコープのいずれかに指定することができます。

APPLICATION
APPLICATION としてスコープが設定されたプロパティーは、JAX-WS Handler 実装、コンシューマー実装コード、およびサービスプロバイダー実装コードで利用できます。ハンドラーがサービスプロバイダー実装にプロパティーを渡す必要がある場合は、プロパティーのスコープを APPLICATION に設定します。コンシューマー実装またはサービスプロバイダー実装コンテキストのいずれかで設定されたすべてのプロパティーは、APPLICATION として自動的にスコープが設定されます。
HANDLER
HANDLER としてスコープ設定されたプロパティーは、JAX-WS Handler 実装でのみ利用できます。Handler 実装からメッセージコンテキストに保存されるプロパティーは、デフォルトで HANDLER としてスコープ設定されます。

メッセージコンテキストの setScope() メソッドを使用して、プロパティーのスコープを変更できます。例42.1「MessageContext.setScope() メソッド」に、メソッドの署名を示します。

例42.1 MessageContext.setScope() メソッド

setScopeStringkeyMessageContext.Scopescopejava.lang.IllegalArgumentException

最初のパラメーターは、プロパティーのキーを指定します。2 番目のパラメーターは、プロパティーの新しいスコープを指定します。スコープは以下のいずれかです。

  • MessageContext.Scope.APPLICATION
  • MessageContext.Scope.HANDLER

ハンドラーのコンテキストの概要

JAX-WS Handler インターフェースを実装するクラスは、メッセージのコンテキスト情報に直接アクセスできます。メッセージのコンテキスト情報は、Handler 実装の handleMessage()handleFault()、および close() メソッドに渡されます。

ハンドラー実装は、スコープに関係なく、メッセージコンテキストに保存されるすべてのプロパティーにアクセスできます。また、論理ハンドラーは LogicalMessageContext と呼ばれる特別なメッセージコンテキストを使用します。LogicalMessageContext オブジェクトには、メッセージボディーの内容にアクセスするメソッドがあります。

サービス実装のコンテキストの概要

サービス実装は、メッセージコンテキストから APPLICATION としてスコープ設定されたプロパティーにアクセスできます。サービスプロバイダーの実装オブジェクトは、WebServiceContext オブジェクトを介してメッセージコンテキストにアクセスします。

詳細は、「サービス実装でのコンテキストの操作」を参照してください。

コンシューマー実装のコンテキストの概要

コンシューマー実装は、メッセージコンテキストの内容に間接的にアクセスすることができます。コンシューマー実装には、個別のメッセージコンテキストが 2 つあります。

  • リクエストコンテキスト: 送信リクエストに使用するプロパティーのコピーを保持します。
  • 応答コンテキスト: 受信応答からのプロパティーのコピーを保持します。

ディスパッチレイヤーは、コンシューマー実装のメッセージコンテキストとハンドラー実装によって使用されるメッセージコンテキスト間で、プロパティーを転送します。

リクエストがコンシューマー実装からディスパッチレイヤーに渡されると、リクエストコンテキストの内容はディスパッチレイヤーで使用されるメッセージコンテキストにコピーされます。サービスから応答が返されると、ディスパッチレイヤーはメッセージを処理し、適切なプロパティーをそのメッセージコンテキストに設定します。ディスパッチレイヤーが応答を処理すると、メッセージコンテキストの APPLICATION としてスコープ設定されたすべてのプロパティーをコンシューマー実装の応答コンテキストにコピーします。

詳細は、「コンシューマー実装でのコンテキストの操作」を参照してください。