JAX-RSを使ったWebサービスのカスタマイズ

CodeZine / 2013年6月19日 14時0分

図3 正規表現で合致しない値を指定した結果

 本連載は、Java Enterprise Edition 6(Java EE 6)の導入方法をはじめとして、新導入された仕様や概念を紹介していきます。今回はNetBeans IDEを使い、JAX-RSを使ったWebサービスを作成とカスタマイズについて紹介します。

■対象読者

Java EE開発に興味ある方 これからJavaのWebアプリケーション開発をはじめる方 ■リソースクラスの作成で自動生成されるもの

 Webサービスを作成すると、Webサービスを定義するリソースクラスUserResource.javaとそれ以外に自動生成されるクラスがあります。NetBeansではリソースクラスに対してWebサービス定義のアノテーションを生成し、さらにJAX-RS用のアプリケーション定義用のクラスも生成します。

●JAX-RSで定義可能なアノテーション

 前回作成したリソースクラスは、自動的に@Pathや@GETなどのアノテーションが作成されています。以下にアノテーション一覧を示します。

表1 JAX-RSで定義可能なアノテーションと用途 アノテーション 定義対象 用途 @Path クラス クラスのURIを定義。 @GET メソッド HTTPメソッドのGETから呼び出され、リソースの取得を記述する。 @POST メソッド HTTPメソッドのPOSTから呼び出され、リソースの更新を記述する。 @PUT メソッド HTTPメソッドのPUTから呼び出され、リソースの新規追加を記述する。 @DELETE メソッド HTTPメソッドのDELETEから呼び出され、リソースの削除を記述する。 @HEAD メソッド HTTPメソッドのHEADから呼び出される。
リソースが存在するか確認するために利用。 @Consumes メソッド クライアントから受信するコンテンツタイプを定義。 @Produces メソッド クライアントへ送信するコンテンツタイプを定義。 @PathParam メソッド引数 リソースのパラメータ部分に対して定義する。 @QueryParam メソッド引数 HTTPリクエストのクエリパラメータに対するリソースへ記載する。 @Provider メソッド @Consumesや@Producesで定義するコンテンツタイプへ送受信する
クラスであることを宣言する。単純な文字列以外にもbyte[]やファイル入出力、
データソース、XML、ストリーミング出力が設定可能になる。 公開するWebサービスに応じてメソッドを追加し、そのメソッドの役割にあったアノテーションを付記していくと、Webサービスとして公開可能になります。

●アプリケーション定義

 前回作成したWebサービスのURI「http://localhost:8080/SampleApp/webresources/user」に含まれている/webresourcesのパスは、RESTful Webサービスでリソースを作成した際にウィザードが自動生成するソースパッケージに含まれる「org.netbeans.rest.application.config」パッケージのApplicationConfig.javaで設定しています。NetBeansはこれを自動的に生成し、GlassFishサーバが自動的に読み込んでいます。なお、このクラスは編集しません。

リスト4 自動生成される設定クラス ApplicationConfig.java
package org.netbeans.rest.application.config; import java.util.Set; import javax.ws.rs.core.Application; @javax.ws.rs.ApplicationPath("webresources") …(1) public class ApplicationConfig extends Application { @Override public Set<Class<?>> getClasses() { return getRestResourceClasses(); } /** * Do not modify this method. It is automatically generated by NetBeans REST support. */ private Set<Class<?>> getRestResourceClasses() { Set<Class<?>> resources = new java.util.HashSet<Class<?>>(); resources.add(sample.webservice.UserResource.class); try { Class<?> jacksonProvider = Class.forName("org.codehaus.jackson.jaxrs.JacksonJsonProvider"); resources.add(jacksonProvider); } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(getClass().getName()).log(java.util.logging.Level.SEVERE, null, ex); } return resources; } }
 (1)の部分で、@javax.ws.rs.ApplicationPath("webresources")と設定されています。これが先ほどのURIに含まれるJAX-RS用のパスとして作用します。

■リソース取得とパス定義

 次にリソース取得のパス定義について紹介します。従来のサーブレットを使ったWebアプリケーションではクエリ文字列や入力フォームから送信するパラメータで対象のデータを指定して取得していますが、RESTの場合はこれらもパスで指定して、URIの一部とします。

 具体的な例を挙げて説明しましょう。例えば、ユーザー情報を検索し表示するサービスを用意し、サーバーへ送信されるパラメータはユーザーを一意に決定するユーザーIDを指定すると定義します。このリソースを定義するURIは次のようになります。

http://localhost:8080/SampleApp/webresources/user/[ユーザ-IDの値]  このリクエストを受け取るクラスは次のようになります。

リスト5: 特定ユーザーリソースを返す UserResource.java
@Path("user/{userid}") public class UserResource { …(省略)… }
 URIが/user/ユーザーIDですので、クラスに付ける@Pathの値も変更します。追加した{userid}はuserの後ろに付けることを宣言しているため、userの次のパスはユーザーIDを示すリソースになります。そこで実際にこのユーザーIDを受け取るメソッドは、次のようになります。

リスト6 特定ユーザーリソースを返すGETメソッドを実装した UserResource.java
@Path("user/{userid}") public class UserResource { …(省略)… @GET @Produces("text/plain") public String getText(@PathParam("userid") String id ) { …(1) return "This is JAX-RS Message,userid is " + id; } }
 (1)の部分、メソッドの引数で@PathParamアノテーションとそれを受け取る引数を定義しています。@PathParamで定義しているのは、リクエストされたURIのパスの中にある「userid」をメソッドの引数であるidに紐づけています。



CodeZine

トピックスRSS

ランキング