先日のJavaOne Reportセミナーで丸山先生が簡単に紹介されていたJAX-WS 2.0ではアノテーションを用いて簡単にWebサービスのプログラムを記述できます。そこで、JAX-WSが標準装備されるJava SE 6で簡単なWebサービスのサーバとクライアントを書いて試してみました。
環境
OS:Windows XP SP2
JDK:Java SE 6 Beta2 build81 (毎週スナップショットのb81)
プログラム
サーバ側プログラム
- Webサービスを実現するクラス Calculator
package server; import javax.jws.WebService; import javax.jws.WebMethod; @WebService public class Calculator { @WebMethod public int add(final int i, final int j) { final int k = i + j; System.out.printf("%d + %d = %d%n", i, j, k); return k; } }
- Webサービスのサーバを起動するクラス WSWrapper
package server; import javax.xml.ws.Endpoint; public class WSWrapper { public static final void main(final String[] args) { Calculator calculator = new Calculator(); Endpoint endpoint = Endpoint.publish("http://localhost:8080/add", calculator); } }
クライアント側プログラム
- WebサービスCalculatorを呼び出すクラス Client
package client; public class Client { public static final void main(final String[] args) { CalculatorService service = new CalculatorService(); Calculator calculator = service.getCalculatorPort(); final int i1 = 12; final int i2 = 34; final int result = calculator.add(i1, i2); System.out.printf("%d + %d = %d%n", i1, i2, result); } }
ビルド
サーバ側
work$ javac -d classes -cp classes -sourcepath src src/server/WSWrapper.java work$ wsgen -d classes -cp classes -wsdl server.Calculator <|| 以下のファイルが生成されます。 >|| classes +--- CalculatorService.wsdl +--- CalculatorService_schema1.xsd +--- server +--- Calculator.class +--- WSWrapper.class +--- jaxws +--- Add.class +--- Add.java +--- AddResponse.class +--- AddResponse.java
クライアント側
work$ wsimport -p client -d classes -wsdllocation http://localhost:8080/add?WSDL \ classes/CalculatorService.wsdl work$ javac -d classes -cp classes src/client/Client.java
以下のファイルが生成されます。
classes +--- client +--- Client.class +--- Add.class +--- AddResponse.class +--- Calculator.class +--- CalculatorService.class +--- ObjectFactory.class +--- package-info.class
実行
サーバ
work$ java -cp classes server.WSWrapper
クライアント
work$ java -cp classes client.Client 12 + 34 = 56 work$
次への一歩
今回はアノテーションに値を省略しましたが、実際にはいくつかの値を設定できます。
その意味・意義を調べようと思います。
- @WebService
- name
- targetNamespace
- serviceName
- portName
- wsdlLocation
- endpointInterface
- @WebMethod
- operationName
- action
- exclude
それから今回使用していませんが、クライアント側でも@WebServiceRefというアノテーションを使うことができるようです。