Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


10.21.2 Webサービスコンテキストのインジェクション

javax.xml.ws.WebServiceContextインタフェースは,JAX-WS 2.2仕様5.3節に記載されているサービスAPIの一つです。Webサービスコンテキストは,javax.annotation.Resourceアノテーションを用いて,リソースをインジェクトして使用します。

Webサービス実装クラスまたはプロバイダ実装クラスの,javax.xml.ws.WebServiceContext型のフィールドまたはjavax.xml.ws.WebServiceContext型を引数とするsetterメソッドに,javax.annotation.Resourceアノテーションを指定します。これによって,指定したフィールドまたは指定したsetterメソッドに対応するフィールドに,処理中のリクエストに関連する情報をインジェクトします。javax.xml.ws.WebServiceContextインタフェースのgetMessageContextメソッドでメッセージコンテキストを取得することで,メッセージコンテキストの情報にアクセスできます。ただし,EJBのWebサービス実装クラスにEJBとしてアクセスする場合,getMessageContextメソッドではメッセージコンテキストを取得できません。また,次のこともできます。

getMessageContextメソッドについては,「19.2.3(2) javax.xml.ws.WebServiceContextインタフェース」を,メッセージコンテキストについては,「19.2.5 メッセージコンテキストの使用」を参照してください。

〈この項の構成〉

(1) javax.annotation.Resourceアノテーションの指定

Webサービスコンテキストのインジェクションでjavax.annotation.Resourceアノテーションを使用する場合,Webサービス実装クラスまたはプロバイダ実装クラス(実装クラスの親クラスを含む)の次に示すフィールドまたはメソッドにjavax.annotation.Resourceアノテーションを指定できます。このフィールドとメソッド以外に指定した場合の動作は保証されません。また,フィールドとフィールドに対応するsetterメソッドに,同時に指定することはできません。

また,Webサービスコンテキストのインジェクションでjavax.annotation.Resourceアノテーションを使用する場合,javax.annotation.Resourceアノテーションで要素は指定できません。指定した場合の動作は保証されません。

javax.annotation.Resourceアノテーションの指定例を次に示します。

(2) ユーザ定義メッセージコンテキストプロパティ追加時の注意事項

ユーザ定義メッセージコンテキストプロパティを追加するときの注意事項について説明します。

(a) インバウンド時のサービス側ハンドラでプロパティを追加する場合

インバウンド時のサービス側ハンドラで追加したユーザ定義メッセージコンテキストプロパティを,Webサービス実装クラスまたはプロバイダ実装クラスから参照する場合,サービス側ハンドラではユーザ定義メッセージコンテキストプロパティを設定したあとに,javax.xml.ws.handler.MessageContextインタフェースのAPIであるsetScope(java.lang.String name, MessageContext.Scope scope)メソッドを使用して,ユーザ定義プロパティをAPPLICATIONスコープとして設定する必要があります。

なお,インバウンド時のサービス側ハンドラで追加したユーザ定義メッセージコンテキストプロパティを,アウトバウンド時のサービス側ハンドラから参照する場合,インバウンド時のサービス側ハンドラでは,ユーザ定義メッセージコンテキストプロパティの設定だけを実施し,setScope(java.lang.String name, MessageContext.Scope scope)メソッドを使用してスコープの設定をする必要はありません。setScope(java.lang.String name, MessageContext.Scope scope)メソッドについては,「19.2.4(8) javax.xml.ws.handler.MessageContextインタフェース」を参照してください。

インバウンド時のサービス側ハンドラで,ユーザ定義メッセージコンテキストプロパティを追加する場合の例を次に示します。

import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;
 
public class ServiceSOAPHandlerImpl implements SOAPHandler<SOAPMessageContext> {
 
    public boolean handleMessage(SOAPMessageContext smContext) {
        // メッセージ方向の取得
        boolean outbound = (boolean)smContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if(outbound) {
           // アウトバウンド処理
           ...
        } else {
           // インバウンド処理
 
           // プロパティをkey値("userPropKey"), value値("userPropValue")で
           // 設定する
           smContext.put("userPropKey", "userPropValue");
           // プロパティのスコープをAPPLICATIONスコープで設定する
           smContext.setScope("userPropKey", MessageContext.Scope.APPLICATION);
           ...
        }
        ...
    }
    ...
}

(b) Webサービス実装クラスまたはプロバイダ実装クラスでプロパティを追加する場合

Webサービス実装クラスまたはプロバイダ実装クラスで追加したユーザ定義メッセージコンテキストプロパティを,アウトバウンド時のサービス側ハンドラから参照する場合,Webサービス実装クラスまたはプロバイダ実装クラスでは,ユーザ定義メッセージコンテキストプロパティの設定だけを実施してください。setScope(java.lang.String name, MessageContext.Scope scope)メソッドを使用してスコープの設定はしないでください。setScope(java.lang.String name, MessageContext.Scope scope)メソッドを使用した場合の動作は保証されません。