36.9.2 Webサービスクライアント側のハンドラチェインの設定
Webサービスクライアント側でハンドラチェインを設定する場合,JAX-WS APIを使用します。使用できるJAX-WS APIについては,「19.2 APIのサポート範囲」を参照してください。
(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オブジェクトのハンドラチェインには影響しません。