対象読者
- Java EE開発に興味ある方
- これからJavaのWebアプリケーション開発をはじめる方
リソースクラスの作成で自動生成されるもの
Webサービスを作成すると、Webサービスを定義するリソースクラスUserResource.javaとそれ以外に自動生成されるクラスがあります。NetBeansではリソースクラスに対してWebサービス定義のアノテーションを生成し、さらにJAX-RS用のアプリケーション定義用のクラスも生成します。
JAX-RSで定義可能なアノテーション
前回作成したリソースクラスは、自動的に@Pathや@GETなどのアノテーションが作成されています。以下にアノテーション一覧を示します。
アノテーション | 定義対象 | 用途 |
---|---|---|
@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サーバが自動的に読み込んでいます。なお、このクラスは編集しません。
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の値]
このリクエストを受け取るクラスは次のようになります。
@Path("user/{userid}") public class UserResource { …(省略)… }
URIが/user/ユーザーIDですので、クラスに付ける@Pathの値も変更します。追加した{userid}はuserの後ろに付けることを宣言しているため、userの次のパスはユーザーIDを示すリソースになります。そこで実際にこのユーザーIDを受け取るメソッドは、次のようになります。
@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に紐づけています。