RESTful な Web サービスを Java 技術で作成する

JAX-RS: より簡単でプラガブルな代替手段

JAX-RS (JSR-311) は Java™ による RESTful なサービスを素早く容易に作成できる Java API です。この API には分散リソースを記述するためのアノテーション・ベースのモデルが用意されています。アノテーションを使用すると、リソースの場所、リソースの表現、そしてプラガブルなデータ・バインディング・アーキテクチャーを指定することができます。この記事では、どのように JAX-RS を使用すれば Java EE 環境で RESTful なサービスのアーキテクチャーによる可能性を実現できるかについて説明します。

Dustin Amrhein, Software Engineer, IBM

Author photoDustin Amrhein は WebSphere Application Server の Web サービスのサポートに従事するソフトウェア・エンジニアです。彼は WebSphere Application Server 6.1 の Web Services Feature Pack と WebSphere Application Server 7.0 の両方の Web サービス・ランタイムを扱った経験があります。彼は Apache Axis2 オープンソース・プロジェクトのコミッターです。彼は Java による RESTful な Web サービスのサポートに関する IBM 全体の方向を定めるチームの一員です。


developerWorks
        プロフェッショナル著者レベル

Nick Gallardo, Software Engineer, IBM

Photo of Nick GallardoNick Gallardo はテキサス州オースチンのソフトウェア・エンジニアです。彼は WebSphere Application Server のさまざまな部分に携わってきており、最初はバージョン 5.0 までさかのぼります。彼は Apache Axis2 オープンソース・プロジェクトのコミッターであり、WebSphere での REST のサポートと JAX-RS に従事してきました。



2010年 2月 23日

はじめに

JAX-RS (JSR-311) は Java EE 環境で RESTful なサービスを提供するための仕様です。JAX-RS は従来の SOAP ベースの Web サービスに代わる有効な手段です。

この記事では、JAX-RS の主要なコンポーネントについて学びます。この記事で紹介する例では、企業が JAX-RS の機能を使用して RESTful な手段で従業員の連絡先情報を公開する方法について説明します。


背景

開発者達は長年さまざまなツールを使用しながら、Java アプリケーションの中で RESTful なサービスを作成してきました。REST のアーキテクチャーは単純であるため、主要な要件である、HTTP メッセージやヘッダーの受信機能を、単純な Java Web コンテナーによって実現することができます。

RESTful なアプリケーションの作成には、一般的に Java サーブレットが使われます。サーブレットを使うための標準的なパターンはありません。通常、サーブレットはリクエストを受け付け、HTTP リクエストの URI 自体を解析し、そのリクエストを既知のリソースと突き合わせようとします。REST サービスを作成する場合には、単純なサーブレット・モデルを拡張して正式な API にします。しかしサーブレット・モデルをベースに API が作成されるため、そうした API はどれも正式な標準として作成されたものではありません。

アーキテクチャーとして REST が採用されることが多くなっていることを踏まえ、JCP (Java Community Process) は、次の Java Enterprise Edition 6 リリースで REST を正式にサポートしようとしています。JSR-311 は既に作成されており、そこから JAX-RS 1.0 仕様が生まれ、RESTful なサービスを作成するための、新しいアノテーション・ベースの手法が提供されています。サーブレット・モデルとは対照的に、JAX-RS アノテーションを利用することで、リソースとデータ・オブジェクトに集中できるようになります。また、(サーブレットを使用して) 通信レイヤーを作成する必要もなくなります。


Java リソース

JAX-RS ではリソースを記述するための用語を定義しており、それらの用語は JAX-RS のプログラミング・モデルによって表現されています。主なものとしては、ルート・リソース、サブリソース、リソース・メソッド、サブリソース・メソッド、そしてサブリソース・ロケーターの 5 つがあります。

ルート・リソース

ルート・リソースは @Path というアノテーションの付いた Java クラスです。@Path アノテーションには、リソースのある場所のパスを示す value 属性があります。value 属性はリテラル文字列の場合や、変数の場合、さらにはカスタマイズされた正規表現が変数に追加されている場合もあります。リスト 1 はルート・リソースの例を示しています。

リスト 1. JAX-RS のルート・リソース
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	...
}

サブリソース

サブリソースはサブリソース・ロケーターを呼び出した結果として返される Java クラスです。サブリソースはルート・リソースと似ていますが、@Path アノテーションがない点が異なります。これはサブリソースのパスがサブリソース・ロケーターに記述されているためです。サブリソースには通常、リクエストを提供するための HTTP リクエスト・メソッド指定子がアノテーションとして付けられたメソッドが含まれています。そうしたアノテーションの付いたメソッドがサブリソースに含まれていない場合には、サブリソースは適切なサブリソース・ロケーターに委譲することで、リクエストを処理するリソースを解決します。

リスト 2. JAX-RS のサブリソース
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.GET;

public class Department {
	


	@GET
	public String getDepartmentName() {
		...
	}


	
}

上記のリスト 2 は ContactsResource.getContactDepartment メソッドによって返されたサブリソースを示しています。この例では、/contact/{contactName}/department というパスに HTTP GET リクエストが送信されると、Department サブリソースの getDepartmentName リソース・メソッドがそのリクエストを処理します。

リソース・メソッド

リソース・メソッドはルート・リソースまたサブリソースの Java メソッドであり、HTTP メソッドにバインドされています。このバインドは @GET などのアノテーションによって行われます。

リスト 3. JAX-RS のリソース・メソッド
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	
	

	@GET
	public List<ContactInfo> getContacts() {
		...
	}


}

リスト 3 の例では、/contacts パスに送信された HTTP GET リクエストは getContacts() リソース・メソッドによって処理されます。

サブリソース・メソッド

サブリソース・メソッドはリソース・メソッドと非常によく似ています。唯一の違いは、サブリソース・メソッドには @Path アノテーションも付いており、このアノテーションによって実行される Java メソッドをさらに修飾している点です。

リスト 4. JAX-RS のサブリソース・メソッド
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;

@Path(value="/contacts")
public class ContactsResource {
	
	@GET
	public List<ContactInfo> getContacts() {
		...
	}
	
	

	@GET
	@Path(value="/ids")
	public List<String> getContactIds() {
		...
	}


}

リスト 4 では、/contacts/ids パスに送信された HTTP GET リクエストは getContactIds() サブリソース・メソッドによって処理されます。

サブリソース・ロケーター

サブリソース・ロケーターは、指定されたリクエストを処理するリソースをさらに解決するメソッドです。サブリソース・ロケーターは @Path アノテーションが付いている点でサブリソース・メソッドと似ていますが、@GET アノテーションのような HTTP リクエスト・メソッド指定子を持っていません。

リスト 5. JAX-RS のサブリソース・ロケーター
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path(value="/contacts")
public class ContactsResource {
	
	@GET
	public List<ContactInfo> getContactss() {
		...
	}
	
		@GET
	@Path(value="/ids")
	public List<String> getContactIds() {
		...
	}
	
	

	@Path(value="/contact/{contactName}/department")
	public Department getContactDepartment(@PathParam(value="contactName") 
		String contactName) {
		...
	}


}

上記の例では、/contact/{contactName}/department パスへの HTTP リクエストはすべて getContactDepartment サブリソース・ロケーターによって処理されます。{contactName} の部分は、contact パスの部分に続く、URL として有効な任意の値を表しています。


アノテーション

このセクションでは、いくつかのよく使われるアノテーションと、その使い方について調べます。JAX-RS 仕様で規定されているアノテーションの完全なリストについては、「参考文献」セクションの JSR-311 へのリンクを参照してください。

@Path

@Path アノテーションは、ルート・リソース、サブリソース・メソッド、またはサブリソースの場所を記述するために使われます。value 属性には、リテラル文字列、変数、そしてカスタムの正規表現を追加した変数を含めることができます。リスト 6 の例は @Path アノテーションの基本的な使い方を示しています。

リスト 6. @Path の使い方
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path(value="/contacts")
public class ContactsResource {

		
	@GET
@Path(value="/{emailAddress:.+@.+\\.[a-z]+}")
	public ContactInfo getByEmailAddress(@PathParam(value="emailAddress") 
		String emailAddress) {
		...
	}
	
	@GET
@Path(value="/{lastName}")
	public ContactInfo getByLastName(@PathParam(value="lastName") String lastName) {
		...
	}
}

ContactsResource クラスに対するアノテーションは、/contacts パスへのリクエストはすべて ContactsResource ルート・リソースによって処理されることを示しています。getByEmailAddress に対する @Path アノテーションは、/contacts/{emailAddress} に送信されるリクエストはすべて (emailAddress は正規表現 .+@.+\\.[a-z]+ を表します)、getByEmailAddress によって処理されることを示しています。

getByLastName メソッドに対する @Path アノテーションによって指定される内容は、/contacts/{lastName} パスに送信されるリクエストはすべて (lastName は、getByEmailAddress の @Path アノテーションで使われている正規表現にはマッチしない有効な URL 部分を表します)、getByLastName メソッドによって処理されることを指定しています。

@GET、@POST、@PUT、@DELETE、@HEAD

@GET、@POST、@PUT、@DELETE、@HEAD は、HTTP リクエスト・メソッド指定子アノテーションです。これらのアノテーションを使用すると、ルート・リソースまたはサブリソースの Java メソッドを HTTP リクエスト・メソッドにバインドすることができます。HTTP GET リクエストは @GET アノテーションの付いたメソッドにマッピングされ、HTTP POST リクエストは @POST アノテーションの付いたメソッドにマッピングされ、等々です。またユーザーは @HttpMethod アノテーションを使用することで、独自にカスタム HTTP リクエスト・メソッド指定子アノテーションを定義することもできます。

リスト 7. カスタム HTTP リクエスト・メソッド指定子アノテーション
package com.ibm.jaxrs.sample.organization;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import javax.ws.rs.HttpMethod;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@HttpMethod("GET")
public @interface CustomGET {

}

上記の宣言は @CustomGET アノテーションを定義しています。このアノテーションの意味は @GET アノテーションと同じであり、@GET アノテーションの代わりとして使うことができます。

@Conumes と @Produces

@Consumes アノテーションはリソースが受け付ける MIME タイプを表します。@Produces アノテーションはリソースから返される MIME タイプを表します。この 2 つのアノテーションが付けられる対象は、リソース、リソース・メソッド、サブリソース・メソッド、サブリソース・ロケーター、サブリソースです。

リスト 8. @Consumes/@Produces
package com.ibm.jaxrs.sample.organization;

import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;

@Path(value="/contacts")
public class ContactsResource {

		
	@GET
	@Path(value="/{emailAddress:.+@.+\\.[a-z]+}")
     @Produces(value={"text/xml", "application/json"})
	public ContactInfo getByEmailAddress(@PathParam(value="emailAddress") 
		String emailAddress) {
		...
	}
	
	@GET
	@Path(value="/{lastName}")
     @Produces(value="text/xml")
	public ContactInfo getByLastName(@PathParam(value="lastName") String lastName) {
		...
	}
	
	@POST
     @Consumes(value={"text/xml", "application/json"})
	public void addContactInfo(ContactInfo contactInfo) {
		...
	}
}

上記の getByEmailAddress メソッドと addContactInfo メソッドは、どちらも text/xmlapplication/json を処理することができます。受け入れられるリソース表現、または返されるリソース表現は、クライアントが設定する HTTP リクエスト・ヘッダーに依存します。@Consumes アノテーションは Content-Type リクエスト・ヘッダーと突き合わされ、あるメソッドが指定リクエストの内容を処理できるかどうかが判断されます。

リスト 9 で、application/jsonContent-Type ヘッダーと /contacts パスへの POST は、ContactsResource クラスの addContactInfo メソッドが呼び出されてリクエストを処理する、ということを意味しています。

リスト 9. Content-Type ヘッダーの使い方
POST /contacts HTTP/1.1
Content-Type: application/json
Content-Length: 32

@Produces アノテーションは逆に Accept リクエスト・ヘッダーと突き合わされ、指定メソッドによって返された表現をクライアントが処理できるかどうかが判断されます。

リスト 10. Accept ヘッダーの使い方
GET /contacts/johndoe@us.ibm.com HTTP/1.1
Accept: application/json

リスト 10 では、/contacts/johndoe@us.ibm.com に対する GET リクエストによって、getByEmailAddress メソッドが呼び出され、その戻りフォーマットが text/xml ではなく application/json である、ということを示しています。


プロバイダー

JAX-RS のプロバイダーは、データ・バインディング、例外のマッピング、コンテキストの解決 (ランタイムに JAXBContext のインスタンスを提供する、など) という 3 つの重要な領域でランタイムの動作をカスタマイズできるアプリケーション・コンポーネントです。JAX-RS の各プロバイダー・クラスには @Provider アノテーションを付ける必要があります。以下の例では MessageBodyWriterMessageBodyReader というデータ・バインディング・プロバイダーを説明します。

MessageBodyWriter

JAX-RS ランタイムは MessageBodyWriter を使用することで、返されたリソースの表現をシリアライズします。JSR-311 準拠のランタイムは一般的な型 (java.lang.String、java.io.InputStream、JAXB オブジェクトなど) をネイティブでサポートしていますが、ユーザーは独自の MessageBodyWriter を JAX-RS ランタイムに提供することができます。例えば、カスタムの MessageBodyWriter を提供することで、Java のカスタムの型 ContactInfo を処理することができます (リスト 11)。

リスト 11. カスタムの MessageBodyWriter
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.MessageBodyWriter;
import javax.ws.rs.ext.Provider;

@Provider
@Produces("text/xml")
public class ContactInfoWriter implements MessageBodyWriter<ContactInfo> {

	public long	getSize(T t, java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType)  {
		...
	}
	
	public boolean isWriteable(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType) {
		return true;
	}
	
	public void writeTo(ContactInfo contactInfo, java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType, MultivaluedMap<
		java.lang.String, java.lang.Object> httpHeaders, java.io.OutputStream 
		entityStream) {
		contactInfo.serialize(entityStream);
	}
}

JAX-RS ランタイムは返されたリソース表現をシリアライズする前に ContactInfoWriter を呼び出します。isWriteable が真を返した場合で、クラスの @Produces の値とリソース・メソッドの @Produces の値が最も近い場合に、writeTo メソッドが呼び出されます。この時点で ContactInfoWriterContactInfo インスタンスの内容を OutputStream にシリアライズします。

MessageBodyReader

MessageBodyReader は MessageBodyWriter と対になるものです。JAX-RS ランタイムは、シリアライズでサポートする型と同じ型をデシリアライズでもネイティブでサポートします。またユーザーは独自の MessageBodyReader の実装を提供することもできます。MessageBodyReader の基本的な機能は、リクエストの InputStream を読み取り、受信されるバイト列を Java オブジェクトにデシリアライズし、リソース・メソッドが想定する形にすることです。ContactInfo 型の MessageBodyReader はリスト 12 のようなものです。

リスト 12. カスタムの MessageBodyReader
package com.ibm.jaxrs.sample.organization;

import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.ext.MessageBodyReader;
import javax.ws.rs.ext.Provider;

@Provider
@Consumes("text/xml")
public class ContactInfoReader implements MessageBodyReader<ContactInfo> {

	public boolean isReadable(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType) {
		return true;
	}
	
	public ContactInfo readFrom(java.lang.Class<ContactInfo> type, 
		java.lang.reflect.Type genericType, java.lang.annotation.Annotation[] 
		annotations, MediaType mediaType, MultivaluedMap<
		java.lang.String,java.lang.String> httpHeaders, java.io.InputStream 
		entityStream) {
		return ContactInfo.parse(entityStream);
	}
	
}

MessageBodyWriter の isWriteable の場合と同様、MessageBodyReader が入力を処理できるかどうかを判断するために ContactInfoReaderisReadable メソッドが呼び出されます。isReadable が真を返した場合で、クラスの @Consumes の値とリソース・メソッドの @Consumes の値が最も近い場合に、ContactInfoReader が選択されます。readFrom メソッドが呼び出されると、その結果として、リクエストの InputStream の内容に基づいて ContactInfo インスタンスが作成されます。


構成

ここまでは、JAX-RS のリソース・クラスについて、またプロバイダー・クラスのサブセット (MessageBodyReaders と MessageBodyWriters) について説明してきました。では、これらのクラスは JAX-RS ランタイムの中でどのように構成されるのでしょう。構成は javax.ws.rs.core.Application クラスを継承することで行われます。このクラスには、一連のクラス、つまりシングルトン・オブジェクトのインスタンス・セットがあり、その中に、JAX-RS アプリケーションのルート・レベルのリソースとプロバイダー (@Provider アノテーションが付けられたクラス) がすべて含まれています。連絡先情報のサンプル・アプリケーション用にこの Application クラスを継承したとすると、リスト 13 のようになります。

リスト 13. ContactInfoApplication
package com.ibm.jaxrs.sample.organization;

import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;

public class ContactInfoApplicaiton extends Application {

	public Set<Class<?>> getClasses() {
		Set<Class<?>> classes = new HashSetSet<Class<?>>();
		classes.add(ContactsResource.class);
		classes.add(ContactInfoWriter.class);
		classes.add(ContactInfoReader.class);
	}
	
	public SetSet<Object<?>> getSingletons() {
		// nothing to do, no singletons
	}
	
}

getClasses メソッドは JAX-RS ランタイムに対し、ランタイムがメタデータと見なす必要のあるクラスのリストを提供します。getSingletons メソッドが何も返さないことに注意してください。一般的に、JAX-RS のプロバイダーをシングルトンとして扱うことは問題ありませんが、JAX-RS のリソースをシングルトンとして扱うためには十分な注意が必要です。アノテーション・ベースの注入は JAX-RS のリソース・クラスでは頻繁に使われますが、シングルトン・インスタンスではサポートされていないかもしれません。従って、十分に計画された場合を除き、JAX-RS リソースのシングルトン・インスタンスを使うことは避ける必要があります。

JAX-RS アプリケーションをサーブレット・コンテナー内にデプロイする場合、JAX-RS ランタイムに javax.ws.rs.core.Application サブクラスを登録する方法は主に 2 通りあります。この処理は WAR ファイルの web.xml によって行います (リスト 14)。

リスト 14. JAX-RS に対応していないサーブレット・コンテナー
<web-app id="WebApp_ID" 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">
	<servlet>
		<servlet-name>ContactInfoServlet</servlet-name>
		<servlet-class>com.sample.RESTSystemServlet</servlet-class>
		<init-param>
			<param-name>javax.ws.rs.Application</param-name>
			<param-value>
				com.ibm.jaxrs.sample.organization.ContactInfoApplication
			</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>ContactInfoServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

JAX-RS に対応していないと見なされるサーブレット・コンテナーの中では、サーブレット定義の init-param として Application サブクラスの名前を提供する必要があります。init-param の名前は javax.ws.rs.Application でなければなりません。サーブレット・クラスはおそらく JAX-RS ランタイム・システムのサーブレットです。URL としては、可能性のある URL の各パターンをリストアップすることもでき、あるいは下記のように /* ワイルドカードを使って登録することもできます。

リスト 15. JAX-RS に対応しているサーブレット・コンテナー
<web-app id="WebApp_ID" 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">
	<servlet>
		<servlet-name>ContactInfoServlet</servlet-name>
		<servlet-class>
			com.ibm.jaxrs.sample.organization.ContactInfoApplication
		</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>ContactInfoServlet</servlet-name>
		<url-pattern>/*</url-pattern>
	</servlet-mapping>
</web-app>

JAX-RS に対応していると見なされるサーブレット・コンテナーの中では、サーブレット定義の中で servlet-class 要素の値として Application サブクラスの名前を指定することができます。この場合にも、URL パターンを個々にリストアップすることもでき、あるいは /* ワイルドカードを使って登録することもできます。


Apache Wink での JAX-RS の実際

次のステップは、JAX-RS に用意された機能をサポートするランタイムを見つけることです。Apache Wink プロジェクトには、上で説明したすべての機能を持つ JAX-RS 準拠のランタイムが用意されています (「参考文献」を参照)。Wink は、さまざまなベンダーとオープンソース・コミュニティーのメンバーとの共同作業として開始されました。Wink プロジェクトの目標は、可能な限り最も柔軟で軽量なランタイムを提供することです。

Wink は JAX-RS の標準的な機能の他に、JSON、Atom、RSS によるシリアライズ・フォーマットのサポートを強化しています。JAX-RS 自体はクライアント API を提供していませんが、Wink にはクライアント API のための、完全にリソース中心の独自のモデルが含まれています。

My developerWorks の Apache Wink グループに参加してください。

My developerWorks の Apache Wink グループに参加し、Apache Wink を使った開発について他の開発者と多様な話題を議論し、またリソースを共有してください。

まだ My developerWorks のメンバーになっていない方は、今すぐ登録してください!

Wink ベースのサービスの開発を単純化するために、Wink 1.0 ライブラリーをダウンロードし、皆さんの RAD (Rational Application Developer) 7.5.5 開発環境 (「参考文献」) の中にデフォルトの JAX-RS ライブラリーとして含めてください。このアップデートによって RAD に JAX-RS ファセットが追加され、このファセットを構成することでバリデーターやアノテーションによる補助を利用できるようになります。またこの新しいアセットによって、サーブレットに必要なエントリーやマッピングも自動生成されるため、サーブレットの構成も単純になります。

まとめ

JAX-RS は、RESTful なサービスを Java で実装するための手段として、従来のサーブレット・モデルに比べ、より有効かつ簡単に使える上に、よりプラガブルなものとなっています。JAX-RS ではアノテーションを使用することで、Java リソースのパスの場所を指定したり、Java メソッドを HTTP リクエスト・メソッドにバインドしたりするのが容易になります。また、プラガブルなデータ・バインディングのアーキテクチャーによって、Java の一部の型がネイティブでサポートされるようになり、シリアライズとデシリアライズのプロセスを完全にカスタマイズできるようになります。さらに、javax.ws.rs.core.Application を継承したサブクラスと、それに対応する web.xml 内の記述によって、最小限のデプロイメント記述子の構成で簡単にアプリケーションをデプロイすることができます。

この記事は JAX-RS が提供する機能の一部を説明したにすぎません。JAX-RS プロバイダーの他の 2 つの型、ContextResolverExceptionMappingProvider を利用すると、アプリケーションのコンテキスト (JAXBContext のインスタンスなど) を提供したり、ランタイムの例外を HTTP レスポンスにマッピングしたりするなどの点で、アプリケーションのコンポーネントを詳細に制御することができます。また、アノテーションを定義してメソッドのパラメーターやクラスのメンバーの注入を管理することにより、実行中のアプリケーションに貴重なコンテキスト情報を提供することができます。こうしたことからわかるように、JAX-RS を利用することで、RESTful なサービスを Java ベースで開発するための、容易に使えてプラガブルで包括的な API が提供されるのです。

参考文献

学ぶために

  • Java.net の JSR-311 プロジェクトを訪れ、この API の案や仕様、またエキスパート・グループとのやり取りのためのメーリング・リストを調べてみてください。
  • REST に関する Roy Fielding による論文、「Architectural Styles and the Design of Network-based Software Architectures」を読んでください。この中に RESTful アーキテクチャーの概念が紹介されています。
  • Apache Wink について学んでください。
  • RESTful Web サービスの基本」(developerWorks、2008年11月) は REST の基本的な原則を紹介しています。
  • Bill Burke 著の『RESTful Java with JAX-RS』(2009年11月 O'Reilly Media 刊) は、RESTful なアーキテクチャーの原則と Java EE 6 の JAX-RS 仕様を利用して分散 Web サービスを Java で設計、開発する方法を学ぶための実践的解説です。
  • developerWorks の Web development ゾーンには Web 2.0 開発のためのツールや情報が豊富に用意されています。
  • developerWorks の Technical events and webcasts で最新情報を入手してください。
  • My developerWorks で developerWorks のエクスペリエンスをパーソナライズしてください。

製品や技術を入手するために

  • RESTful な Web サービスを構築するためのフレームワーク、Apache Wink をダウンロードしてください。
  • IBM 製品の試用版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development, SOA and web services
ArticleID=475647
ArticleTitle=RESTful な Web サービスを Java 技術で作成する
publish-date=02232010