Groovy で Webサービス公開

Groovy1.1 を使えば、アノテーションが使用できるので Groovy スクリプトで WebServices のクラスを定義する事が可能。

ただし、wsgen コマンドを使う場合は、groovyc コマンドで Java クラスを作成する必要があるなど、Groovy で実行するメリットはあまり無いため、そのうち Groovy だけで WebServices を公開する方法を探ってみたいと思う。

とりあえず今回は、JavaSE 6 を同様の手順で実施してみた。

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

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

@WebService アノテーションをクラスに付与して、groovyc コマンドで Java のクラスを生成する。
ただし、Groovy で定義したクラスの場合、Groovy 用の public メソッドが groovyc の実行時に追加されるため、@WebMethod アノテーションで明示的にメソッドを指定しておく必要がある。

testMessage.groovy
import javax.jws.WebService
import javax.jws.WebMethod

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

    @WebMethod
    def String hello(String msg) {
        return "${msg}:${this}"
    }

}
Java クラスの生成
>groovyc testMessage.groovy

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

先に生成した Java クラスファイルを指定して wsgen コマンドを実行する。
ただし、groovyc で生成したクラスは、Groovy 用のインターフェースを実装しているため、wsgen 実行時のクラスパスに groovy の jar ファイルを指定する必要がある。

wsgen 実行例
>wsgen -cp.;%GROOVY_HOME%\lib\groovy-1.1-beta-2.jar TestMessage

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

testServer.groovy
import javax.xml.ws.Endpoint

Endpoint.publish("http://localhost:8080/test", new TestMessage())
実行例
>groovy testServer.groovy

備考

クライアントは wsimport を使って Java のクラスを生成し、Groovy スクリプトから呼び出すだけ。

testClient.groovy
import test.*

tm = new TestMessageService().testMessagePort
println tm.hello("てすと")