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>

ちなみに、JSON と XML データの文字コードUTF-8 となる。