Groovy で Jersey を動かしてみる

Jersey を以下の条件で動かしてみる。(Groovy 1.5.6, Jersey 0.8 使用)

  • リソースクラスを Groovy スクリプトで記述
  • HttpServer の実行も Groovy スクリプトで

Groovy スクリプトの作成

Groovy スクリプトを作成する。アノテーションの記述に関して以下のような Java との違いがあるので注意。

  • @Produces アノテーションに値を記述する場合は [] で配列を明示する必要がある

また、Groovy スクリプトで記述したリソースクラスを使うために、ContainerFactory の createContainer クラスメソッドにリソースクラスを直接指定する方法を使った。

test.groovy
import javax.ws.rs.GET
import javax.ws.rs.Path
import javax.ws.rs.PathParam
//import javax.ws.rs.ProduceMime
//ProduceMime は Produces に変更(Jersey 1.0.2)
import javax.ws.rs.Produces

import com.sun.net.httpserver.HttpHandler
import com.sun.jersey.api.container.httpserver.HttpServerFactory
import com.sun.jersey.api.container.ContainerFactory

@Path("message")
public class SimpleResource {

    @GET
    @Path("{id}")
    //@ProduceMime(["text/plain"])
    @Produces(["text/plain"])
    public String getMessage(@PathParam("id") String id) {
        return "テスト=" + id
    }
}

def server = HttpServerFactory.create("http://localhost:8082/", ContainerFactory.createContainer(HttpHandler.class, [SimpleResource.class] as Set))

server.start()

println "server started ..."

System.in.read()

server.stop(0)

実行

jersey の lib ディレクトリ内の JAR ファイルをクラスパスに設定する等(groovy-starter.conf の編集やユーザーディレクトリの .groovy/lib に配置する方が便利)しておき、groovy コマンドでスクリプトを実行。

>groovy test.groovy
server started ...

Web ブラウザ等で http://localhost:8082/message/a10 等にアクセスすると「テスト=a10」のようなテキストが表示され、リソースクラスが正常に動作している事が確認できる。

JAXB を使った Groovy スクリプトの場合

Groovy スクリプト内で JAXB のアノテーションを使ったクラスを定義する場合、@XmlAccessorType(XmlAccessType.NONE) を使ってフィールドなどの自動バインドを抑制する必要があるようなので注意。

スクリプトは以下の環境で動作確認した。

  • Groovy 1.6.0
  • Jersey 1.0.2
jsonSample.groovy
import javax.ws.rs.GET
import javax.ws.rs.Produces
import javax.ws.rs.Path
import javax.ws.rs.PathParam

import javax.xml.bind.annotation.*

import com.sun.net.httpserver.HttpHandler
import com.sun.jersey.api.container.httpserver.HttpServerFactory
import com.sun.jersey.api.container.ContainerFactory

@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Customer {
    @XmlElement
    int id

    @XmlElement
    String name

    @XmlElement
    String address
}

@Path("customer")
public class CustomerResource {

    @GET
    @Path("{id}")
    @Produces(["application/json"])
    public Customer getJsonCustomer(@PathParam("id") int id) {
        return new Customer(id: id, name: "ABC株式会社", address: "東京都・・・")
    }

    @GET
    @Produces(["application/json"])
    public List<Customer> getJsonCustomerList() {
        return [
            new Customer(id: 10, name: "テストデータ", address: ""),
            new Customer(id: 11, name: "テストデータ2", address: ""),
            new Customer(id: 12, name: "テストデータ3", address: "")
        ]
    }
}

def server = HttpServerFactory.create("http://localhost:8082/", ContainerFactory.createContainer(HttpHandler.class, [CustomerResource.class] as Set))

server.start()

println "server start ..."
println "please enter key to stop"

System.in.read()

server.stop(0)

なお、上記のスクリプトを実行した後に、http://localhost:8082/customer にアクセスすると JSON ファイルを取得できる。