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メソッドではメッセージコンテキストを取得できません。また,次のこともできます。
-
インバウンド時のサービス側ハンドラで追加したAPPLICATIONスコープのユーザ定義メッセージコンテキストプロパティを,Webサービス実装クラスまたはプロバイダ実装クラスから参照できます。
-
Webサービス実装クラスまたはプロバイダ実装クラスで追加したユーザ定義メッセージコンテキストプロパティを,アウトバウンド時のサービス側ハンドラから参照できます。
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メソッドに,同時に指定することはできません。
-
javax.xml.ws.WebServiceContext型のフィールド(staticおよびfinalのフィールドを除く)
-
javax.xml.ws.WebServiceContext型を引数とする公開対象にならないsetterメソッド※(staticおよびfinalのメソッドを除く)
- 注※
-
非publicのsetterメソッド,またはexclude要素がtrueのjavax.jws.WebMethodアノテーションが指定されているsetterメソッドです。
また,Webサービスコンテキストのインジェクションでjavax.annotation.Resourceアノテーションを使用する場合,javax.annotation.Resourceアノテーションで要素は指定できません。指定した場合の動作は保証されません。
javax.annotation.Resourceアノテーションの指定例を次に示します。
-
フィールドへの指定例
import javax.annotation.Resource; import javax.jws.WebService; import javax.servlet.ServletContext; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.WebServiceContext; @WebService public class AddNumbersImpl { // wsContextフィールドに現在処理中のリクエスト関連情報をインジェクトする @Resource private WebServiceContext wsContext; public int add(int number1, int number2) throws AddNumbersFault { // メッセージコンテキストを取得する MessageContext mContext = wsContext.getMessageContext(); // プロパティを取得する ServletContext sContext = (ServletContext)mContext.get(MessageContext.SERVLET_CONTEXT); ... } ... }
-
setterメソッドへの指定例
import javax.annotation.Resource; import javax.jws.WebService; import javax.xml.ws.handler.MessageContext; import javax.xml.ws.WebServiceContext; @WebService public class AddNumbersImpl { // setterメソッドに対応するwsContextフィールドに現在処理中のリクエスト関連情報をインジェクトする private WebServiceContext wsContext; @Resource private void setWebServiceContext(WebServiceContext wsContext) { this.wsContext = wsContext; } public int add(int number1, int number2) throws AddNumbersFault { // メッセージコンテキストを取得する MessageContext mContext = wsContext.getMessageContext(); // プロパティを設定する mContext.put("userPropKey", "userPropValue"); ... } ... }
(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)メソッドを使用した場合の動作は保証されません。