簡単な Web アプリを書かなければいけなくなったので、ちょっと RESTful な実装にしてみようかなということで Jersey をつかいはじめてみました。他にも JAX-RS の実装はいろいろあるようなのですが、参照実装のようなので基本を押さえる意味で、これにしてみました。
久しぶりに Java によるウェブアプリケーション構築をしましたが、シンプルで使いやすいライブラリですね。
以下、作業メモ。
† ライブラリのダウンロード
基本的には Maven で導入するようなのですが、今回は手っ取り早く動かすために、 jar を直接 WEB-INF/lib に放り込むことにしました。j必要になる jar は Jsersey - Download を開くと少し下に A zip of Jersey というリンクがあるので、これをクリックすると jersey-archive-1.11.zip のようなアーカイブが取得できます。zip を解凍すると lib の中に入っていますのでこれを使います。
† web.xml
今回は Tomcat 7 で実行したので下記のような web.xml を使いました。
このシンプルな感じが何とも言えません。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>jaxrsexample</display-name>
<servlet>
<servlet-name>Jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
† 定番の HelloWorld からスタート
とりあえず定番の HelloWorld からスタートしてみます。
jaxrsexample/Hello.java
package jaxrsexample;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class Hello {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String sayHello() {
return "HelloWorld";
}
}
クラスが作成できたら、 http://localhost:8080/jaxrsexample/hello にアクセスすると HelloWorld が表示されます。
† XMLを返すようにしてみる
メソッドの返り値が String なので、これを XML にしてみます。
JAXBが使えるようなので、下記のようなItems と Item を作って XML にシリアライズしてみました。
jaxrsexample/Items.java
package jaxrsexample;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Items {
private List<Item> items;
public Items() {
items = new ArrayList<Item>();
}
public Items(List<Item> items) {
this.items = items;
}
@XmlAttribute
public int getCount() {
return items.size();
}
@XmlElement(name = "item")
public List<Item> getItems() {
return items;
}
public void setItems(List<Item> items) {
this.items = items;
}
}
jaxrsexample/Item.java
package jaxrsexample;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Item {
private String name;
private String value1;
private String value2;
public Item() {
}
public Item(String name, String value1, String value2) {
super();
this.name = name;
this.value1 = value1;
this.value2 = value2;
}
@XmlElement
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@XmlElement
public String getValue1() {
return value1;
}
public void setValue1(String value1) {
this.value1 = value1;
}
@XmlElement
public String getValue2() {
return value2;
}
public void setValue2(String value2) {
this.value2 = value2;
}
}
jaxrsexample/Hello2.java
package jaxrsexample;
import java.util.Arrays;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello2")
public class Hello2 {
@GET
@Produces(MediaType.TEXT_XML)
public Items sayHello() {
return new Items(
Arrays.asList(
new Item("foo", "foo_aaa", "foo_bbb"),
new Item("bar", "bar_aaa", "bar_bbb"),
new Item("baz", "baz_aaa", "baz_bbb")
)
);
}
}
上記の3つのクラスを作成して、 http://localhost:8080/jaxrsexample/hello2 にアクセスすると下記の XML が帰ってくるのが確認できます。
(下記は整形していますが、実際には改行やスペースは入っていません。)
<items count="3">
<item>
<name>foo</name>
<value1>foo_aaa</value1>
<value2>foo_bbb</value2>
</item>
<item>
<name>bar</name>
<value1>bar_aaa</value1>
<value2>bar_bbb</value2>
</item>
<item>
<name>baz</name>
<value1>baz_aaa</value1>
<value2>baz_bbb</value2>
</item>
</items>
とりあえず今日はこんなところまで。
† 参考
・ Jersey
・ REST: Jersey configuration on Tomcat - Surya Suravarapu
・ JAX-RS(Jersey)を使ってみる - azuki note
・ JAX-RSの基本的な機能(1/4):企業のIT・経営・ビジネスをつなぐ情報サイト EnterpriseZine (EZ)
・ JAXB Annotations for SOA/IoC