JavaSE 6 で Webサービス公開と実行

JavaSE 6 には JAX-WS 2.0 が用意されており、簡単に WebServices を公開・実行する事が可能になっている。

WebServices を公開・実行する手順は以下の通り。

  1. WebService アノテーションを使って WebServices 公開用のクラスを定義
  2. wsgen コマンドを使って関連クラスを自動生成
  3. Endpoint クラスを使って WebServices を公開
  4. wsimport コマンドを使ってクライアント用の関連クラスを自動生成
  5. クライアントから WebServices 実行

WebService アノテーションを使って WebServices 公開用のクラスを定義

javax.jws.WebService アノテーションをクラスに付与するだけで、全ての public メソッドが公開される。

なお、クラスがパッケージに属していない場合、targetNamespace を明示的に指定する必要がある。

TestMessage.java
import javax.jws.WebService;

@WebService(targetNamespace = "http://test")
public class TestMessage {

    public String hello(String msg) {
        return msg + ":" + this;
    }
}

wsgen コマンドを使って関連クラスを自動生成

@WebService を付与したクラスをコンパイルして、wsgen コマンドの引数に与える事で、WebServices 公開に必要なクラスが自動的に生成される。

wsgen の実行例
>wsgen -cp . TestMessage

クラスの生成先を指定しない場合は、jaxws ディレクトリにファイルが生成される。

Endpoint クラスを使って WebServices を公開

javax.xml.ws.Endpoint クラスの publish クラスメソッドに公開する URL と WebServices 用に定義したクラスのインスタンスを与えるだけで、WebServices として公開される。Servlet Engine 内で実行させていた頃に比べると格段に簡単になったものである。

TestServer.java
import javax.xml.ws.Endpoint;

public class TestServer {

    public static void main(String[] args) {
        Endpoint.publish("http://localhost:8080/test", new TestMessage());
    }
}
実行例
>java TestServer

なお、Endpoint.publish に指定した URL に ?wsdl を付けた URL で、WSDL ファイルの取得が可能。(例. http://localhost:8080/test?wsdl

wsimport コマンドを使ってクライアント用の関連クラスを自動生成

wsimport に WSDL へのパスを指定してクライアント用の関連クラスを自動生成する。

wsimport 実行例
>wsimport http://localhost:8080/test?wsdl

targetNamespace を基にしたパッケージ内にクラスが自動生成される。

クライアントから WebServices 実行

wsimport で生成された XXXService クラス(例. test.TestMessageService)の getXXXPort() メソッド(例. getTestMessagePort())で、WSDL に対応したインスタンスが取得できるので、これを使用して WebServices のメソッドを呼び出す。

TestClient.java
import test.TestMessage;
import test.TestMessageService;

public class TestClient {

    public static void main(String[] args) {
        TestMessageService service = new TestMessageService();
        TestMessage tm = service.getTestMessagePort();

        System.out.println(tm.hello("テスト"));
    }
}
クライアントの実行例
>java TestClient