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」の部分は任意の文字列を指定すればよく、それに応じて表示される名前も変わるはずだ。

図2「Takaaki」の部分にはパラメータとして指定された名前が表示される

なお今回使用したアノテーションはすべてJAX-RSの標準仕様で定義されているものなので、JAX-RS準拠のフレームワークであればRESTEasy以外でも同様の方法で利用できるようになっている。