JSR 311: JAX-RS: The Java API for RESTful Web Services

JSR 311は、JavaプラットフォームにおいてREST(REpresentational State Transfer)スタイルのWebアプリケーションを開発するためのAPI仕様で、「JAX-RS」という略称で呼ばれている。現在RESTスタイルのアプローチは、WebアプリケーションにおいてはSOAPベースのアプローチと同様に一般的なものとなっている。

JavaプラットフォームではJAX-WS 2.0においてSOAPをサポートしており、比較的容易にSOAPベースのWebアプリケーションを作成することができる。一方RESTについてはSOAPに比べると低レベルなAPIしか用意されていないため実装が複雑になりやすいという問題を抱えていた。

JAX-RSの目的は、RESTスタイルのWebアプリケーションを開発するためのより高レベルなAPIを提供しようというものである。RESTアーキテクチャでは、リソースを特定するための識別子としてURIを、リソースにアクセスするためのプロトコルとしてHTTP(POST/GET/PUT/DELETE)を利用する。JAX-RSではWebリソースとURIの関連付けや、HTTPリクエストに対して呼び出される処理の指定などをアノテーションを使用して行えるようにするという。また、RESTfulサービスをServletやJAX-WS(Java API for XML Web Services)のエンドポイントとしてデプロイするための方法も提供する。

JSR 311は将来的にJava EEおよびJava SEプラットフォームに統合されることを目指して仕様の策定が進められている。すでにJava EE 6仕様となるJSR 313ではJSR 311を取り込む予定となっており、先週紹介したServlet 3.0仕様でもJSR 311との互換性を考慮するとしている。

JSR 311の参照実装を試す

JSR 311の参照実装は「Jersey」という名称で開発が進められており、6月19日(現地時間)、java.net内にあるプロジェクトサイトにおいてStable版のEarly Access(EA)が公開された。本稿執筆時点ではLatest版として0.1.1 EAが公開されており、ドキュメント&ファイルセクションよりバイナリおよびソースコードをダウンロードすることができる。

Jerseyを使用するにはダウンロードしたファイルを解凍し、libディレクトリ以下にあるJARファイル群をクラスパスに含めてコンパイル/実行すればよい。

それではさっそくJerseyを使ってみよう。まず、非常にシンプルなWebリソースとしてリスト1のようなクラスを作成した。ここで@UriTemplateというアノテーションは、このリソースに対するURIパスを指定するもの。@HttpMethodアノテーションはメソッドをHTTPのリクエストに関連付けるもので、今回はGETリクエストで処理する。@ProduceMimeはメソッドが返すコンテンツのMIMEタイプを指定するアノテーションだ。そのほか、メソッドに渡すコンテンツを指定する@ConsumeMimeアノテーションなども用意されている。

リスト1 Message.java - Webリソースの例

package apisample;

import javax.ws.rs.HttpMethod;
import javax.ws.rs.ProduceMime;
import javax.ws.rs.UriTemplate;

@UriTemplate("/message")
public class Message {
    @HttpMethod("GET")
    @ProduceMime("text/plain")  
    public String getMessage() {
        return "Hello JAX-RS!";
    }    
}

続いて、このWebリソースを公開するWebサービスをリスト2のように作成する。今回はJava SE 6に付属する軽量HTTPサーバであるcom.sun.net.httpserver.HttpServerを使用してサービスの公開を行っている。HttpHandlerはリクエストに対する応答を行うためのインタフェースで、RESTfulサービスのためのものはcom.sun.ws.rest.api.container.ContainerFactoryクラスを用いて生成することができる。

リスト2 SimpleService.java - Messageを使用するWebサービス

package apisample;

import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
import com.sun.ws.rest.api.container.ContainerFactory;
import java.io.IOException;
import java.net.InetSocketAddress;

public class SimpleService { 
    public static void main(String[] args) throws IOException {
        HttpHandler handler = ContainerFactory.createContainer(
                    HttpHandler.class,
                    Message.class);

        HttpServer server = HttpServer.create(
                    new InetSocketAddress(8080),
                    0);
        server.createContext("/", handler);
        server.setExecutor(null);
        server.start();
    }    
}

このプログラムをコンパイルして実行すると、localhost:8080上の/messageにWebサービスが公開される。したがってブラウザからhttp://localhost:8080/messageにアクセスすれば、getMessage()メソッドが実行されて図1のように表示される。

図1 ブラウザからhttp://localhost:8080/messageにアクセス

リリーススケジュール

今後のスケジュールとしては、まず今年8月にEarly Draft review、11月にPublic Review、2008年1月にProposed final draftを経て、最終リリースは2008年3月になる予定。当然、その間仕様の細部は修正されていくことになるが、参照実装であるJerseyには最新のものが反映されていくだろう。