先日の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というアノテーションを使うことができるようです。