RESTEasyとは
世界最高峰の自転車プロロードレース「ツール・ド・フランス」が今年も始まった。今年は2名の日本人選手が出場しており、すでに第2、第3ステージでそれぞれ5位、8位を獲得するという日本のロードレース史上に残る快挙を成し遂げている。しばらくは寝不足の日々が続きそうだ。
さて、今回紹介する「RESTEasy」はオープンソースのJAX-RS実装である。JAX-RSはJavaプラットフォームにおいてREST(REpresentational State Transfer)スタイルのWebアプリケーションを開発するためのAPI仕様であり、次期Java EEプラットフォームとなるJava EE 6に追加される新機能としても注目されている。
JAX-RSの公式な参照実装はGlassFishプロジェクトのサブプロジェクトとして開発されている「Jersey」だが、RESTEasyはそれとは別にJBoss Communityによって進められているプロジェクトである。JBossが提供する各種プロダクトと密に連携させることができる点や、クライアントサイドで利用可能なフレームワーク「RESTEasy JAX-RS Client Framework」が提供されている点などが他のJAX-RS実装に対する強みとなっている。その他、RESTEasyは次のような特徴を持つ。
- 多くのServletコンテナで動作可能
- HTTP 1.1仕様によるクライアントキャッシュのサポート
- サーバサイドでのインメモリキャッシュのサポート
- XML、JSON、YAML、Fastinfoset、Multipart、XOP、Atomなどに対応したプロバイダセット
- 非同期HTTP(Comet)のサポート
- 非同期ジョブサービスのサポート
- EJB、Seam、Guice、Spring、Spring MVCとのシームレスな統合
- GZIPエンコーディングをサポート
RESTEasyを利用したWebリソースの作成例
それでは、実際にRESTEasyを使ってみよう。本稿執筆時点における最新版は6月17日にリリースされたRESTEasy 1.1.GAで、このページよりダウンロードすることができる。今回はバイナリや必要なライブラリがセットになった「resteasy-jaxrs-1.1.GA-all.zip」の方を利用する。
ダウンロードしたファイルを展開すると「resteasy-jaxrs-war」というディレクトリが含まれている。RESTEasy本体はServletコンテナにwar形式で配備する。したがってRESTEasyを利用してアプリケーションを作る場合には、このディレクトリをコピーしてテンプレートとして利用するか、または同じ構造のディレクトリを自分で作成すればよい。
ディレクトリ内のファイル配置は通常のServletアプリケーションと同様だ。すなわち、自前のクラスファイルはWEB-INF/classes以下に配置するか、jar化してWEB-INF/libに配置すればよい。今回は図1のように配置した。WEB-INF/libディレクトリにはRESTEasyの利用に必要なjarファイルが収めてある。
図1 warファイルの中身のファイル配置例 |
実際のWebリソースを定義しているのはSimpleMessageクラスである。今回は単にメッセージを返すだけのシンプルなリソースとして次のようなクラスを作成した。
リスト1
package jp.co.mycom.toolde;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/message")
public class SimpleMessage {
public SimpleMessage() {
}
@GET
@Path("/{name}")
@Produces("text/plain")
public String getMessage(@PathParam("name") String name) {
return "Hello " + name;
}
}
@Pathはこのリソースに対するURIパスを指定するアノテーションであり、クラスおよびメソッドに対して付加することができる。@GETはメソッドに指定することでHTTPのGETリクエストに関連付けるアノテーション。HTTPのリクエストの種類を指定するアノテーションとしては他に@POSTや@PUT、@DELETEなどがある。@Produceメソッドが返すコンテンツのMIMEタイプを指定するアノテーションだ。
さて、この例ではクラスに対するPathとして「/message」を、メソッドに対するPathとして「/{name}」を指定している。この{}で指定されたものはパラメータとして処理され、@PathParamアノテーションを用いることでメソッドの引数に関連付けることができる。すなわちこの例では、「http://~~/message/Sugiyama」というURLでアクセスされた場合にはnameには「Sugiyama」という文字列が渡され、「http://~~/message/Takaaki」というURLでアクセスされた場合にはnameには「Takaaki」という文字列が渡されることになる。
作成したリソースをWebサービスとして公開するためのweb.xmlは以下のように記述する。
リスト2
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>My RESTEasy Application</display-name>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
RESTEasyはServletの一種として動作するようになっているため、それに必要なservletおよびlistenerの定義を記述しておく。その他のオプションはcontext-param要素を用いて設定する。設定可能なオプションについてはこのページの表を参照のこと。ここではresteasy.scanをtrueにすることで、JAX-RSリソースのクラスを自動で検索して登録するようにしている。
ここまでできたら、図1の配置でRESTEasySample.warというファイルにwar化し、Servletコンテナに配備する。Webサーバをlocalshot:8080で公開している場合、Webブラウザから「http://localshot:8080/RESTEasy/message/Takaaki」にアクセスすれば図2のように表示される。最後の「Takaaki」の部分は任意の文字列を指定すればよく、それに応じて表示される名前も変わるはずだ。
なお今回使用したアノテーションはすべてJAX-RSの標準仕様で定義されているものなので、JAX-RS準拠のフレームワークであればRESTEasy以外でも同様の方法で利用できるようになっている。