3.6.3 JAX-WS APIを使用する場合の実装例
Application ServerのJAX-WS機能がサポートしているJAX-WS APIを利用して,Webサービスクライアントを実装できます。JAX-WS APIのサポート範囲については,「19.2 APIのサポート範囲」を参照してください。
(1) JAX-WS APIを使用する場合のWebサービスクライアントの実装例
JAX-WS APIを使用したWebサービスクライアントの実装例を示します。
package com.example.sample.client;
import com.example.sample.TestJaxWs;
import com.example.sample.TestJaxWsService;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.Iterator;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Service;
import javax.xml.ws.WebServiceException;
public class TestClient {
public static void main( String[] args ) {
// WSDLのURLとサービス名を設定
URL url = null;
try {
url = new URL("http://localhost:8085/fromwsdl/test?wsdl");
} catch (MalformedURLException e) {
// 例外処理
}
QName serviceName =
new QName("http://example.com/sample", "TestJaxWsService");
// Serviceインスタンスの生成
Service service = Service.create(url, serviceName);
System.out.println(service.getWSDLDocumentLocation());
QName portName = null;
// ポート名のリストを表示
Iterator it = service.getPorts();
while(it.hasNext()) {
portName = (QName)it.next();
System.out.println(portName);
}
// ポートの取得
TestJaxWs port = (TestJaxWs)service.getPort(TestJaxWs.class);
// 送信コンテキストの取得
Map<java.lang.String, java.lang.Object>context =
((BindingProvider)port).getRequestContext();
System.out.println(context.entrySet());
// サービスのメソッド呼び出し
try {
port.jaxWsTest1( "TEST", 123);
} catch (WebServiceException e) {
// 例外処理
}
}
}
(2) javax.xml.ws.Serviceオブジェクトおよびポートの再利用
javax.xml.ws.Serviceオブジェクトの生成には処理コストが掛かるので,一度生成したjavax.xml.ws.Serviceオブジェクトは再利用することをお勧めします。ポートを取得するためにjavax.xml.ws.Serviceオブジェクトを複数回生成する必要はありません。
同様に,ポートの取得にも処理コストが掛かるので,一度取得したポートは再利用することをお勧めします。ポートのWebメソッドを複数回呼び出すためにポートを複数回取得する必要はありません。ただし,複数スレッドでポートを共有する場合,共有するポートの要求コンテキストのプロパティに対する設定は,複数スレッドが動作する前に実行してください。複数スレッドの動作中にプロパティに対する設定を行うと,通信が失敗したり,不正なSOAPメッセージが送信されたりすることがあります。なお,ポートは要求コンテキスト以外,スレッドセーフです。
WebサービスクライアントをサーブレットやEJBなどで実装する場合は,それぞれの初期化メソッドでjavax.xml.ws.Serviceオブジェクトの生成,またはポートの取得を実施し,再利用してください。ポートの要求コンテキストのプロパティに対する変更も,それぞれの初期化メソッドで実行してください。