!!!クライアント !!WSDLから関連クラスを生成する方法 !手順 1.WSDL から 必要なファイルを作成 2.作成したファイルを利用して、サービスを利用する !1.WSDL から 必要なファイルを作成 サーバのサービスを起動した状態で以下を実行 wsimport -d client http://localhost:8080/test?wsdl または、 wsimport -keep -d client http://localhost:8080/test?wsdl -keep オプションでソースを残せる !2.作成したファイルを利用して、サービスを利用する {{code Java, import test.TestService; import test.TestServiceService; public class TestClient { public static void main(String[] args){ //クラスに Service が付くのでクラス名はちゃんと考えたほうがいい TestServiceService service = new TestServiceService(); TestService port = service.getTestServicePort(); String result = port.test001(10); System.out.println(result); } } }} javac -cp client;. TestClient.java 実行は java -cp client;. TestClient !!動的にエンドポイントアドレスを変更する方法 アノテーションで {{code Java, @WebServiceRef(wsdlLocation = "http://localhost:8080/hoge?wsdl") private static TestServiceService service }} とするとできるらしいが、うまくいかない。 その場合は、 {{code Java, TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"),new QName("http://test/", "TestServiceService")); }} Java7以降は、 {{code Java, TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl")); }} でもOK.。 その後で、 ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test"); でアドレスを変更(たぶん、しなくてもすでに変わっていると思うけど・・・) {{code Java, import test.TestService; import test.TestServiceService; import javax.xml.namespace.QName; import javax.xml.ws.WebServiceRef; import javax.xml.ws.BindingProvider; import java.net.URL; public class TestClient { public static void main(String[] args){ try { TestServiceService service = new TestServiceService(new URL("http://localhost:8080/test?wsdl"),new QName("http://test/", "TestServiceService")); // TestServiceService service = new TestServiceService(new URL("http://localhost:8080/test?wsdl")); TestService port = service.getTestServicePort(); ((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test"); System.out.println(((BindingProvider)port).getRequestContext().get("javax.xml.ws.service.endpoint.address")); String result = port.test001(100); System.out.println(result); } catch (Exception e){ e.printStackTrace(); } } } }} !!JAX-WS (WSDL) のバージョンが古い場合 サーバが提供するWSDLのバージョンが古い場合、 wsimport を実行すると use="encoded"がサポートされていない 等のメッセージが表示されることがある。 その場合は、 Apache Axis 1(1.4 Final)を使う。 !準備 http://archive.apache.org/dist/ws/axis/1_4/ からaxis 1.4をダウンロードする。 {{ref axis-bin-1_4.zip}} !WSDLからJavaの生成 lib以下のjarにクラスパスを通して、 org.apache.axis.wsdl.WSDL2Java を実行する。 java org.apache.axis.wsdl.WSDL2Java http://langrid.org/service_manager/wsdl/kyoto1.langrid:KyotoUJServer?wsdl バッチを作るなら以下の様な感じ @echo off setlocal set base=%~dp0 set CLASSPATH=%base%/lib set CLASSPATH=%CLASSPATH%;%base%/lib/axis-ant.jar set CLASSPATH=%CLASSPATH%;%base%/lib/axis.jar set CLASSPATH=%CLASSPATH%;%base%/lib/commons-discovery-0.2.jar set CLASSPATH=%CLASSPATH%;%base%/lib/commons-logging-1.0.4.jar set CLASSPATH=%CLASSPATH%;%base%/lib/jaxrpc.jar set CLASSPATH=%CLASSPATH%;%base%/lib/log4j-1.2.8.jar set CLASSPATH=%CLASSPATH%;%base%/lib/saaj.jar set CLASSPATH=%CLASSPATH%;%base%/lib/wsdl4j-1.5.1.jar java org.apache.axis.wsdl.WSDL2Java %* !呼び出し 流れとしては +Locatorを生成 +Locator#getサービス(new URL(エンドポイント)) でサービスを取得 サービスの関数呼び出し {{code Java, import java.net.URL; import org.apache.axis.client.Stub; import Translation.nlp.nict.servicetype.Kyoto1LangridKyotoUJServerLocator; import Translation.nlp.nict.servicetype.TranslationService; public class Test{ public static void main(String[] args) throws Exception{ // Translation Kyoto1LangridKyotoUJServerLocator jserverLoc = new Kyoto1LangridKyotoUJServerLocator(); TranslationService transService = jserverLoc.getTranslation( new URL("Input endpoint URL")); Stub stub = (Stub)transService; stub.setUsername("Your temporary ID or Language Grid ID"); stub.setPassword("Your temporary password or Language Grid password"); String ret = transService.translate("en", "ja", "Hello."); System.out.println(ret); } } }} !!!サーバ 大きく以下の二通りの方法がある。 ・プログラム単体でWebサーバの役割も担う方法 ・Tomcatを利用する方法 !!プログラムでサーバを立てる方法 http://itpro.nikkeibp.co.jp/article/COLUMN/20080801/311972/ http://unageanu.hatenablog.com/entry/20090722/1248257955 !手順 1.呼び出されるクラス(WebService)とメソッド(WebMethod)を作成 2.WSDLに必要なファイルを作成 ※この手順を省くと実行時に自動で作成するみたい 3.WebService のランチャーを作成 !1.呼び出されるクラス(WebService)とメソッド(WebMethod)を作成 {{code Java, package test; import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class TestService { @WebMethod public String test001(int i){ return "引数は " + i + " です。"; } } }} javac -d server TestService.java !2.WSDLに必要なファイルを作成 wsgen -d server -cp server test.TestService または、 wsgen -keep -d server -cp server test.TestService -keep オプションでソースファイルを残せる !3.WebService のランチャーを作成 {{code Java, package test; import javax.xml.ws.Endpoint; public class ServiceLuncher { public static void main(String[] args){ Endpoint.publish("http://localhost:8080/test",new TestService()); } } }} javac -d server -cp server ServiceLuncher.java サービスを起動するには java -cp server test.ServiceLuncher !!Tomcatを利用する方法 http://kenichiro22.hatenablog.com/entry/20101015/1287130478 http://tdottjpn.blogspot.jp/2008/06/tomcatwebservice.html http://www.melange.co.jp/blog/?p=1491 !Tomcatに必要なライブラリの準備 TomcatでSOAPのサービスを提供するにはライブラリが必要。 いくつか種類があるが、ここでは Metro を使う。 他にも CXFやAxis2などがある。 比較は以下のURL参照。 http://www.ibm.com/developerworks/jp/java/library/j-jws14/ Metroのダウンロード https://metro.java.net/ MetroをTomcatに組み込む catalina.sh stop ant -Dtomcat.home= -f /metro-on-tomcat.xml install catalina.sh start TOMCAT_HOME/shared/lib以下にファイルがコピーされる。 *webservices-tools.jar *webservices-extra.jar *webservices-extra-api.jar *webservices-rt.jar もし、tomcatに組み込みたくない場合は各アプリの WEB-INF/lib の中に上記のjarファイルをコピーしてもよい。 !ファイル構成 └─WEB-INF │ web.xml │ sun-jaxws.xml │ ├─classes │ └─test │ TestService.class │ └─lib(このファイルは前述の通り、必要に応じて) webservices-extra-api.jar webservices-extra.jar webservices-rt.jar webservices-tools.jar !web.xml JAX-WS Sample Application com.sun.xml.ws.transport.http.servlet.WSServletContextListener jax-ws Test com.sun.xml.ws.transport.http.servlet.WSServlet 1 jax-ws Test *.ws !sun-jaxws.xml !TestService.java {{code Java, package test; import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class TestService { @WebMethod public String test001(int i){ return "引数は " + i + " です。"; } } }} !wsdlの確認 tomcatにアクセスして、wsdlが取得できるか確認する。 http://localhost:8080/soap/test.ws URLのsoapの部分はtomcatの設定次第。環境によって変わる。 !!!WS-Security http://www.ibm.com/developerworks/jp/java/library/j-jws13.html {{category2 プログラミング言語,Java}}