torutkのブログ

ソフトウェア・エンジニアのブログ

Java SE 6でJAX-WSを使ったWebサービスプログラミング

先日のJavaOne Reportセミナーで丸山先生が簡単に紹介されていたJAX-WS 2.0ではアノテーションを用いて簡単にWebサービスのプログラムを記述できます。そこで、JAX-WSが標準装備されるJava SE 6で簡単なWebサービスのサーバとクライアントを書いて試してみました。

環境

OS:Windows XP SP2
JDK:Java SE 6 Beta2 build81 (毎週スナップショットのb81)

プログラム

サーバ側プログラム
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;
    }
}
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);
    }        
}
クライアント側プログラム
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というアノテーションを使うことができるようです。

参考文献

JAX-WS関係の参考文献

現状丸山先生の記事だけですね。