42.2. サービス実装でのコンテキストの操作

概要

コンテキスト情報は、WebServiceContext インターフェイスを使用してサービス実装で利用できるようになります。WebServiceContext オブジェクトから、アプリケーションスコープの現在のリクエストのコンテキストプロパティーが反映された MessageContext オブジェクトを取得できます。プロパティーの値を操作することができ、それらは応答チェーンを介して伝播されます。

注記

MessageContext インターフェイスは、java.util.Map インターフェイスを継承します。その内容は、Map インターフェイスのメソッドを使用して操作できます。

コンテキストの取得

サービス実装でメッセージコンテキストを取得するには、次の手順を実行します。

  1. WebServiceContext 型の変数を宣言します。
  2. 変数に javax.annotation.Resource アノテーションを付け、コンテキスト情報が変数に注入されていることを示します。
  3. getMessageContext() メソッドを使用して、WebServiceContext オブジェクトから MessageContext オブジェクトを取得します。

    重要

    getMessageContext() は、@WebMethod アノテーションが付けられたメソッドでのみ使用できます。

例42.2「サービス実装でのコンテキストオブジェクトの取得」 は、コンテキストオブジェクトを取得するためのコードを示しています。

例42.2 サービス実装でのコンテキストオブジェクトの取得

import javax.xml.ws.*;
import javax.xml.ws.handler.*;
import javax.annotation.*;

@WebServiceProvider
public class WidgetServiceImpl
{
  @Resource
  WebServiceContext wsc;

  @WebMethod
  public String getColor(String itemNum)
  {
    MessageContext context = wsc.getMessageContext();
  }

  ...
}

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

実装に MessageContext オブジェクトを取得したら、 例42.3「MessageContext.get() メソッド」 に記載されている get() メソッドを使用して、そこに保存されているプロパティーにアクセスできます。

例42.3 MessageContext.get() メソッド

VgetObjectkey

注記

この get() は、マップインターフェイスから継承されます。

key パラメーターは、コンテキストから取得するプロパティーを表す文字列です。get() は、プロパティーの適切な型にキャストする必要があるオブジェクトを返します。表42.1「サービス実装コンテキストで使用可能なプロパティー」 は、サービス実装のコンテキストで使用可能ないくつかのプロパティーを示しています。

重要

コンテキストから返されるオブジェクトの値を変更すると、コンテキスト内のプロパティーの値も変更されます。

例42.4「サービスのメッセージコンテキストからのプロパティーの取得」 は、呼び出された操作を表す WSDL operation 要素の名前を取得するコードを示します。

例42.4 サービスのメッセージコンテキストからのプロパティーの取得

import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.message.Message;

  ...
  // MessageContext context retrieved in a previous example
  QName wsdl_operation = (QName)context.get(Message.WSDL_OPERATION);

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

実装に MessageContext オブジェクトを取得したら、例42.5「MessageContext.put() メソッド」に記載されている put() メソッドを使用して、プロパティーを設定し、既存のプロパティーを変更できます。

例42.5 MessageContext.put() メソッド

VputKkeyVvalueClassCastExceptionIllegalArgumentExceptionNullPointerException

設定中のプロパティーがメッセージコンテキストにすでに存在する場合、put() メソッドは既存の値を新しい値に置き換え、古い値を返します。プロパティーがメッセージコンテキストにまだ存在しない場合は、put() メソッドはプロパティーを設定し、null を返します。

例42.6「サービスのメッセージコンテキストでのプロパティーの設定」 は、HTTP リクエストの応答コードを設定するためのコードを示しています。

例42.6 サービスのメッセージコンテキストでのプロパティーの設定

import javax.xml.ws.handler.MessageContext;
import org.apache.cxf.message.Message;

  ...
  // MessageContext context retrieved in a previous example
  context.put(Message.RESPONSE_CODE, new Integer(404));

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

表42.1「サービス実装コンテキストで使用可能なプロパティー」 サービス実装オブジェクトのコンテキストを介してアクセス可能なプロパティーを一覧表示します。

表42.1 サービス実装コンテキストで使用可能なプロパティー

プロパティー名説明

org.apache.cxf.message.Message

PROTOCOL_HEADERS[a]

トランスポート固有のヘッダー情報を指定します。この値は java.util.Map<String, List<String>> として保存されます。

RESPONSE_CODE

コンシューマーに返される応答コードを指定します。この値は Integer オブジェクトとして保存されます。

ENDPOINT_ADDRESS

サービスプロバイダーのアドレスを指定します。この値は String として保存されます。

HTTP_REQUEST_METHOD

リクエストとともに送信される HTTP 動詞を指定します。この値は String として保存されます。

PATH_INFO

要求されているリソースのパスを指定します。この値は String として保存されます。

パスは、ホスト名の後、クエリー文字列の前の URI の部分です。たとえば、エンドポイントの URI が http://cxf.apache.org/demo/widgets の場合、パスは /demo/widgets になります。

QUERY_STRING

リクエストの呼び出しに使用される URI に添付されているクエリーがある場合は、それを指定します。この値は String として保存されます。

クエリーは、URI の最後の ? の後に表示されます。たとえば、http://cxf.apache.org/demo/widgets?color にリクエストが行われた場合、クエリーは color になります。

MTOM_ENABLED

サービスプロバイダーが SOAP 添付ファイルに MTOM を使用できるかどうかを指定します。この値は Boolean として保存されます。

SCHEMA_VALIDATION_ENABLED

サービスプロバイダーがスキーマに対してメッセージを検証するかどうかを指定します。この値は Boolean として保存されます。

FAULT_STACKTRACE_ENABLED

ランタイムが障害メッセージとともにスタックトレースを提供するかどうかを指定します。この値は Boolean として保存されます。

CONTENT_TYPE

メッセージの MIME タイプを指定します。この値は String として保存されます。

BASE_PATH

要求されているリソースのパスを指定します。この値は java.net.URL として保存されます。

パスは、ホスト名の後、クエリー文字列の前の URI の部分です。たとえば、エンドポイントの URL が http://cxf.apache.org/demo/widgets の場合、ベースパスは /demo/widgets になります。

ENCODING

メッセージのエンコーディングを指定します。この値は String として保存されます。

FIXED_PARAMETER_ORDER

パラメーターを特定の順序でメッセージに表示する必要があるかどうかを指定します。この値は Boolean として保存されます。

MAINTAIN_SESSION

コンシューマーが将来の要求のために現在のセッションを維持するかどうかを指定します。この値は Boolean として保存されます。

WSDL_DESCRIPTION

実装されているサービスを定義する WSDL ドキュメントを指定します。この値は org.xml.sax.InputSource オブジェクトとして保存されます。

WSDL_SERVICE

実装されているサービスを定義する wsdl:service 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_PORT

サービスにアクセスするのに使用するエンドポイントを定義する wsdl:port 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_INTERFACE

実装されているサービスを定義する wsdl:portType 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_OPERATION

コンシューマーによって呼び出される操作に対応する wsdl:operation 要素の修飾名を指定します。この値は QName として保存されます。

javax.xml.ws.handler.MessageContext

MESSAGE_OUTBOUND_PROPERTY

メッセージがアウトバウンドであるかどうかを指定します。この値は Boolean として保存されます。true は、メッセージがアウトバウンドであることを指定します。

INBOUND_MESSAGE_ATTACHMENTS

リクエストメッセージに含まれる添付ファイルが含まれます。この値は java.util.Map<String, DataHandler> として保存されます。

マップのキー値は、ヘッダーの MIME Content-ID です。

OUTBOUND_MESSAGE_ATTACHMENTS

応答メッセージの添付ファイルが含まれます。この値は java.util.Map<String, DataHandler> として保存されます。

マップのキー値は、ヘッダーの MIME Content-ID です。

WSDL_DESCRIPTION

実装されているサービスを定義する WSDL ドキュメントを指定します。この値は org.xml.sax.InputSource オブジェクトとして保存されます。

WSDL_SERVICE

実装されているサービスを定義する wsdl:service 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_PORT

サービスにアクセスするのに使用するエンドポイントを定義する wsdl:port 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_INTERFACE

実装されているサービスを定義する wsdl:portType 要素の修飾名を指定します。この値は QName として保存されます。

WSDL_OPERATION

コンシューマーによって呼び出される操作に対応する wsdl:operation 要素の修飾名を指定します。この値は QName として保存されます。

HTTP_RESPONSE_CODE

コンシューマーに返される応答コードを指定します。この値は Integer オブジェクトとして保存されます。

HTTP_REQUEST_HEADERS

リクエストの HTTP ヘッダーを指定します。この値は java.util.Map<String, List<String>> として保存されます。

HTTP_RESPONSE_HEADERS

応答の HTTP ヘッダーを指定します。この値は java.util.Map<String, List<String>> として保存されます。

HTTP_REQUEST_METHOD

リクエストとともに送信される HTTP 動詞を指定します。この値は String として保存されます。

SERVLET_REQUEST

サーブレットのリクエストオブジェクトが含まれます。この値は javax.servlet.http.HttpServletRequest として保存されます。

SERVLET_RESPONSE

サーブレットの応答オブジェクトが含まれます。この値は javax.servlet.http.HttpResponse として保存されます。

SERVLET_CONTEXT

サーブレットのコンテキストオブジェクトが含まれます。この値は javax.servlet.ServletContext として保存されます。

PATH_INFO

要求されているリソースのパスを指定します。この値は String として保存されます。

パスは、ホスト名の後、クエリー文字列の前の URI の部分です。たとえば、エンドポイントの URL が http://cxf.apache.org/demo/widgets の場合、パスは /demo/widgets になります。

QUERY_STRING

リクエストの呼び出しに使用される URI に添付されているクエリーがある場合は、それを指定します。この値は String として保存されます。

クエリーは、URI の最後の ? の後に表示されます。たとえば、http://cxf.apache.org/demo/widgets?color にリクエストが行われた場合、クエリー文字列は color になります。

REFERENCE_PARAMETERS

WS-Addressing 参照パラメーターを指定します。これには、wsa:IsReferenceParameter 属性が true に設定されているすべての SOAP ヘッダーが含まれます。この値は java.util.List として保存されます。

org.apache.cxf.transport.jms.JMSConstants

JMS_SERVER_HEADERS

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

[a] HTTP を使用する場合、このプロパティーは標準の JAX-WS 定義のプロパティーと同じです。