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 ファイルを取得できる。