クライアント
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.作成したファイルを利用して、サービスを利用する
1 |
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
動的にエンドポイントアドレスを変更する方法
アノテーションで
1 |
@WebServiceRef(wsdlLocation = "http://localhost:8080/hoge?wsdl") private static TestServiceService service |
とするとできるらしいが、うまくいかない。
その場合は、
1 |
TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl"),new QName("http://test/", "TestServiceService")); |
Java7以降は、
1 |
TestServiceService service = new TestServiceService(new URL("http://localhost:8080/hoge?wsdl")); |
でもOK.。
その後で、
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY,"http://localhost:8080/test");
でアドレスを変更(たぶん、しなくてもすでに変わっていると思うけど・・・)
1 |
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をダウンロードする。
axis-bin-1_4.zip(471)
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(エンドポイント)) でサービスを取得
サービスの関数呼び出し
1 |
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)を作成
1 |
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 のランチャーを作成
1 |
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=<TOMCAT_INSTALL_DIR> -f <METRO_INSTALL_DIR>/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
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>JAX-WS Sample Application</display-name> <listener> <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> </listener> <servlet> <servlet-name>jax-ws Test</servlet-name> <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jax-ws Test</servlet-name> <url-pattern>*.ws</url-pattern> </servlet-mapping> </web-app>
sun-jaxws.xml
<?xml version="1.0" encoding="UTF-8"?> <endpoints version="2.0" xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime"> <endpoint implementation="test.TestService" name="TestService" url-pattern="/test.ws"/> </endpoints>
TestService.java
1 |
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
[カテゴリ: プログラミング言語 > Java]
[通知用URL]
Tweet
最終更新時間:2016年09月21日 23時16分34秒