Jersey を試してみる
JAX-RS(JSR-311)の参照実装である Jersey(0.8-ea)を試してみた。
手順は以下の通り。
- リソースクラスの作成
- HttpServerを使った実行クラス作成
- ビルドと実行
なお、インストールは Jersey のサイトから jersey-0.8-ea.zip ファイルをダウンロードし、適当なディレクトリに解凍する。
リソースクラスの作成
今回は、JSON と XML を取得するサンプルを作る。
Jersey ではリソースクラスのメソッドの戻り値に JAXB を使ったクラスを返すとメディアタイプの指定に応じて JSON や XML に自動変換してくれるので、まず JAXB でマーシャリング可能なクラスを作成。
Customer.java
package sample.data; import java.util.Date; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Customer { public int id; public String name; public Date registeredDate; }
アクセサメソッドを記述するのが面倒だったので、public フィールドを使っている。(JAXB 的には基本的に問題なくXML化される)
次にリソースクラスを作成する。リソースクラスでは以下のようなアノテーションを使って記述していく。
- @Path で URL へのマッピング方法を定義
- @Produces(Jersey0.8の時点では ProduceMime)でレスポンスのメディアタイプを指定
- @GET で HTTP の GET メソッドに応答する事を指定
- @PathParam で URL のパスの一部を引数にマッピングする
基本的に、URL に応じてリソースクラスのメソッドが呼び出され、メソッドの戻り値がレスポンスとなる。
リソースクラス CustomerResource.java
package sample.resources; import java.util.Date; 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 sample.data.Customer; @Path("customer") public class CustomerResource { // "/customer/番号/json" という URL への GET で //このメソッドが呼び出され JSON データが返される @GET @Path("{id}/json") //@ProduceMime("application/json") @Produces("application/json") public Customer getCustomerAsJson(@PathParam("id") int id) { return this.createCustomer(id, "ABC株式会社"); } // "/customer/番号/xml" という URL への GET で //このメソッドが呼び出され XML データが返される @GET @Path("{id}/xml") //@ProduceMime("application/xml") @Produces("application/xml") public Customer getCustomerAsXml(@PathParam("id") int id) { return this.createCustomer(id, "株式会社サンプル"); } private Customer createCustomer(int id, String name) { Customer result = new Customer(); result.id = id; result.name = name; result.registeredDate = new Date(); return result; } }
HttpServerを使った実行クラス作成
とりあえず動作させるだけなら、HttpServer を使った方法が手っ取り早いので、今回はそのための実行クラスを作成した。
なお、HttpServerFactory の create クラスメソッドで生成した HttpServer オブジェクトの start メソッドを呼び出すだけで、クラスパス内にあるリソースクラスを使えるようにしてくれる。
実行クラス Main.java
package sample; import com.sun.net.httpserver.HttpServer; import com.sun.jersey.api.container.httpserver.HttpServerFactory; import java.io.IOException; public class Main { public static void main(String[] args) throws IOException { HttpServer server = HttpServerFactory.create("http://localhost:8082/"); server.start(); System.out.println("server started ..."); System.in.read(); server.stop(0); } }
ビルドと実行
以下のような Ant ビルドファイルを作成。環境変数 JERSEY_HOME には jersey を解凍したディレクトリへのパスを設定。
build.xml
<project name="Jersey Sample" default="compile" basedir="."> <property environment="env" /> <property name="src.dir" value="src" /> <property name="dest.dir" value="dest" /> <path id="project.classpath"> <pathelement path="${dest.dir}" /> <fileset dir="${env.JERSEY_HOME}/lib"> <include name="**/*.jar" /> </fileset> </path> <target name="compile"> <mkdir dir="${dest.dir}"/> <javac srcdir="${src.dir}" destdir="${dest.dir}" > <classpath refid="project.classpath" /> <include name="**/*.java" /> </javac> </target> <target name="run" depends="compile"> <java classname="sample.Main" fork="yes"> <classpath refid="project.classpath" /> </java> </target> <target name="clean"> <delete dir="${dest.dir}" /> </target> </project>
ant コマンドでビルドしサーバーを起動する。
>ant run
サーバーを実行した状態で、Web ブラウザ等で http://localhost:8082/customer/1/json にアクセスすると以下のような JSON データが取得され、
{"customer":{"id":"1","name":"ABC株式会社","registerdDate":"2008-05-22T23:31:39.321+09:00"}}
http://localhost:8082/customer/5/xml にアクセスすると以下のような XML データが取得される。
<customer> <id>5</id> <name>株式会社サンプル</name> <registeredDate>2008-05-22T23:35:28.410+09:00</registeredDate> </customer>