36.9.2 Webサービスクライアント側のハンドラチェインの設定

Webサービスクライアント側でハンドラチェインを設定する場合,JAX-WS APIを使用します。使用できるJAX-WS APIについては,「19.2 APIのサポート範囲」を参照してください。

<この項の構成>
(1) ハンドラチェインを設定するコードの追加
(2) SOAPロールとアクタの設定
(3) soap:mustUnderstand属性の設定

(1) ハンドラチェインを設定するコードの追加

Webサービスクライアント側のハンドラチェインの設定には,次の二つの方法があります。

それぞれの設定方法について説明します。

(a) サービスクラスへのハンドラチェインの設定

APIを使用して,サービスクラスにハンドラチェインを設定するコードを追加したWebサービスクライアントの例を示します。

package com.example.sample.client;

import com.example.sample.TestJaxWs;
import com.example.sample.TestJaxWsService;
import com.example.sample.UserDefinedException;

public class TestClient {
   public static void main( String[] args ) {
       try {
           TestJaxWsService service = new TestJaxWsService();
           //ハンドラリゾルバを生成してサービスクラスに設定
           SampleHandlerResolver handlerResolver = new SampleHandlerResolver();
           service.setHandlerResolver( handlerResolver );
           TestJaxWs port = service.getTestJaxWs();
           
           String returnValue = port.jaxWsTest1( "Invocation test.", 1003 );
           
           System.out.println( "[RESULT] " + returnValue );
       }
       catch( UserDefinedException e ){
           e.printStackTrace();
       }
   }
}

ハンドラリゾルバの例を示します。

package com.example.sample.client;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;
import javax.xml.ws.soap.SOAPBinding;

public class SampleHandlerResolver implements HandlerResolver{
   //このハンドラリゾルバで保持するハンドラチェイン
   private List<Handler> handlerChain = new ArrayList<Handler>();

   //都合のよい方法でハンドラチェインにハンドラを追加しておく
   //ここではコンストラクタで追加する
   public SampleHandlerResolver(){
       this.handlerChain.add( new SomeHandler() );
   }

   //ハンドラチェインを返す
   public List<Handler> getHandlerChain( PortInfo portInfo ){
       //portInfoオブジェクトの内容を調べ
       //このハンドラリゾルバで処理可能であればハンドラチェインを返す
       if( portInfo.getBindingID().equals( SOAPBinding.SOAP11HTTP_BINDING )
           && portInfo.getPortName().equals( ... )
           && portInfo.getServiceName().equals( ... ) ){
           return this.handlerChain;
       }
       else{
           ...
       }
   }
}

javax.xml.ws.Service#setHandlerResolverメソッドで設定されたハンドラリゾルバへの変更は,それ以前に同じServiceオブジェクトから取得されたポートのハンドラチェインには影響しません。

(b) ポートへのハンドラチェインの設定

APIを使用して,ポートにハンドラチェインを設定するコードを追加したWebサービスクライアントの例を示します。

package com.example.sample.client;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.Binding;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.handler.Handler;

import com.example.sample.TestJaxWs;
import com.example.sample.TestJaxWsService;
import com.example.sample.UserDefinedException;

public class TestClient {
   public static void main( String[] args ) {
       try {
           TestJaxWsService service = new TestJaxWsService();
           TestJaxWs port = service.getTestJaxWs();

           //ポートに設定するハンドラチェインを生成
           List<Handler> handlerChain = new ArrayList<Handler>();
           //ハンドラチェインにハンドラを追加
           handlerChain.add( new SomeHandler() );

           //javax.xml.ws.Bindingを取得
           Binding binding = ( ( BindingProvider )port ).getBinding();

           //javax.xml.ws.Bindingを使用してポートにハンドラチェインを設定
           binding.setHandlerChain(handlerChain);

           String returnValue = port.jaxWsTest1( "Invocation test.", 1003 );
           System.out.println( "[RESULT] " + returnValue );
       }
       catch( UserDefinedException e ){
           e.printStackTrace();
       }
   }
}

サービスクラスとサービスクラスから取得したポートの両方にハンドラチェインを設定した場合は,ポートに設定されているハンドラチェインを使用します。また,javax.xml.ws.Binding#setHandlerChainメソッドで設定されたハンドラチェインは,ポートの取得元になったServiceオブジェクトのハンドラチェインには影響しません。

(2) SOAPロールとアクタの設定

SOAPロールおよびアクタの設定を省略した場合,または空文字を指定した場合は,デフォルトの値が設定されます。デフォルトの値は,SOAP 1.1仕様のSOAPメッセージの場合は"http://schemas.xmlsoap.org/soap/actor/next",SOAP 1.2仕様のSOAPメッセージの場合は"http://www.w3.org/2003/05/soap-envelope/role/ultimateReceiver"です。

(3) soap:mustUnderstand属性の設定

soap:mustUnderstand属性には,"0","1","true",または"false"を設定してください。それ以外の値を設定した場合は,"0"または"false"が設定されているものと見なされます。