12.3.1 ルートリソースクラスを作成する

ルートリソースクラスを作成します。ここでは,次のリソースメソッド,サブリソースメソッド,サブリソースロケータ,およびインジェクションの対象となるコンストラクタ,フィールド,beanプロパティを持つルートリソースクラスを作成します。

表12-3 作成するルートリソースクラス

項目要求メソッド識別子/root以下のコンテキストパス備考
リソースメソッドresourceMethod1@GET
resourceMethod7@POST
  • フォーム値をインジェクトするFormParamアノテーションでアノテートされたパラメタを持ちます。
  • MIMEタイプ"*/*"のHTTPエンティティを受け取ります。
  • MIMEタイプ"application/xml"のHTTPエンティティを返します。
サブリソースメソッドsubResourceMethod2@GET/getQueryParam
subResourceMethod3@POST/getUriInfoAndEntityエンティティパラメタを持ちます。
subResourceMethod4@GET/getHttpHeadersHttpHeadersをインジェクトするContextアノテーションでアノテートされたパラメタを持ちます。
subResourceMethod5@GET/getMatrixParamマトリクスパラメタをインジェクトするMatrixParamアノテーションでアノテートされたパラメタを持ちます。
subResourceMethod6@GET/getCookieParamCookieをインジェクトするCookieParamアノテーションでアノテートされたパラメタを持ちます。
subResourceMethod8@GET/getPathParamパスパラメタをインジェクトするPathParamアノテーションでアノテートされたパラメタを持ちます。
subResourceMethod ThrowingException@GET/{path:[A-Z][a-z]+}/exception例外をスローします。スローされた例外は例外マッピングプロバイダRuntimeExceptionMapperによってHTTPエンティティにマッピングされます。
pojoJsonMappingMethod@POST/pojoJsonMappingJSON形式のデータを処理します。
サブリソースロケータsubResourceMethod9/subresourceLocatorサブリソースクラスSubResourceに処理を委譲します。
コンストラクタUriInfoをインジェクトするContextアノテーションでアノテートされたパラメタを持ちます。
フィールドRequestをインジェクトするContextアノテーションでアノテートされています。
beanプロパティクエリパラメタをインジェクトするQueryParamアノテーションでアノテートされています。

(凡例)-:該当する内容がないことを示します。


ルートリソースクラスの作成例を次に示します。

package com.sample.resources;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.CookieParam;
import javax.ws.rs.FormParam;
import javax.ws.rs.MatrixParam;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.DefaultValue;
import javax.ws.rs.Encoded;
import javax.ws.rs.Consumes;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

//サンプル:ルートリソースクラス
//このクラスはURI "/root"でアクセスされる
@Path("/root")
public class Resource {

   //コンテキスト(javax.ws.rs.core.Requestオブジェクト)の
   //フィールドへのインジェクション
   private @Context
   Request request;
   
   //setter()メソッドを使用したクエリパラメタのインジェクション
   @QueryParam("queryParam")
   public void setQueryParam(String queryParam) {
       this.queryParam = queryParam;
   }
   //上記のsetter()メソッドでインジェクトされたクエリパラメタを
   //格納するprivateフィールド
   private String queryParam;
   
   //コンテキスト(javax.ws.rs.core.UriInfoオブジェクト)の
   //コンストラクタパラメタへのインジェクション
   public Resource(@Context UriInfo uriInfo) {
       this.uriInfo = uriInfo;
   }
   //上記のコンストラクタでインジェクトされたUriInfoオブジェクトを
   //格納するprivateフィールド
   private UriInfo uriInfo;
   
   //サンプル:リソースメソッド1
   //  フィールドにインジェクトされたコンテキストの値
   //  (javax.ws.rs.core.Requestオブジェクト)を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   public String resourceMethod1() {
       String returnString = "RequestMethod: " + request.getMethod();
       return returnString;
   }

   //サンプル:サブリソースメソッド2
   //  setter()メソッドにインジェクトされたクエリパラメタの値を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   //このメソッドはURI "/root/getQueryParam"でアクセスされる
   @Path("getQueryParam")
   public String subResourceMethod2() {
       String returnString = "QueryParameter: " + queryParam;
       return returnString;
   }
   
   //サンプル:サブリソースメソッド3
   //  コンストラクタパラメタにインジェクトされた
   //  コンテキストの値(javax.ws.rs.core.UriInfoオブジェクト)と,
   //  受信したHTTPリクエストのエンティティボディを返す
   //このメソッドはHTTP POSTリクエストを処理する
   @POST
   //このメソッドはURI "/root/getUriInfoAndEntity"でアクセスされる
   @Path("getUriInfoAndEntity")
   public String subResourceMethod3(
           //エンティティパラメタ(アノテートされていないパラメタ)は
           //HTTPリクエストのエンティティボディからマッピングされる
           String entity) {
       String returnString = "UriInfo: " + uriInfo.getPath() + "; Entity: " + entity;
       return returnString;
   }
   
   //サンプル:サブリソースメソッド4
   //  サブリソースメソッドパラメタにインジェクトされた
   //  コンテキストの値(javax.ws.rs.core.HttpHeadersオブジェクト)を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   //このメソッドはURI "/root/getHttpHeaders"でアクセスされる
   @Path("getHttpHeaders")
   public String subResourceMethod4(
           //javax.ws.rs.core.HttpHeadersオブジェクトの
           //サブリソースメソッドパラメタへのインジェクション
           @Context HttpHeaders httpHeaders) {
       String returnString = "HttpHeaders: " +
           httpHeaders.getRequestHeader("header").get(0).toString();
       return returnString;
   }
   //サンプル:サブリソースメソッド5
   //  サブリソースメソッドパラメタにインジェクトされた
   //  マトリクスパラメタの値を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   //このメソッドはURI "/root/getMatrixPara"でアクセスされる
   @Path("getMatrixParam")
   public String subResourceMethod5(
           //デフォルト値はマトリクスパラメタに与えられる
           @DefaultValue("defaultValue")
           //マトリクスパラメタの
           //サブリソースメソッドパラメタへのインジェクション
           @MatrixParam("matrix") String matrixParam) {
       String returnString = "MatrixParam: " + matrixParam;
       return returnString;
   }
   
   //サンプル:サブリソースメソッド6
   //  サブリソースメソッドパラメタにインジェクトされたCookieの値を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   //このメソッドはURI "/root/getCookieParam"でアクセスされる
   @Path("getCookieParam")
   public String subResourceMethod6(
           //自動URI復号化を無効にする
           @Encoded
           //Cookieのサブリソースメソッドパラメタへのインジェクション
           @CookieParam("cookie") String cookieParam ) {
       String returnString = "CookieParam: " + cookieParam;
       return returnString;
   }
   //サンプル:リソースメソッド7
   //  リソースメソッドパラメタにインジェクトされた値を返す
   //このメソッドはMIMEメディアタイプで定義された内容を使用する
   @Consumes("*/*")
   //このメソッドはMIMEメディアタイプ"application/xml"で定義された
   //内容を使用する
   @Produces("application/xml")
   //このメソッドはHTTP POSTリクエストを処理する
   @POST
   public Response resourceMethod7(
           //formパラメタのリソースメソッドパラメタへのインジェクション
           @FormParam("form") String formParam ) {
       ResponseBuilder rb = Response.status(200)
           .entity("<FormParam>" + formParam + "</FormParam>" )
           .type("application/xml");
       return rb.build();
   }

   //サンプル:サブリソースメソッド8
   //  サブリソースメソッドパラメタにインジェクトされた
   //  パスパラメタの値を返す
   //このメソッドはHTTP GETリクエストを処理する
   @GET
   //このメソッドはURI "/root/getPathParam/{path:[A-Z][a-z]+}"で
   //アクセスされる
   //"getPathParam/{path:[A-Z][a-z]+}"は変数を含むURIテンプレートである
   //"{path:[A-Z][a-z]+}"は正規表現を使用している
   @Path("getPathParam/{path:[A-Z][a-z]+}")
   public String subResourceMethod8(
           //パスパラメタの
           //サブリソースメソッドパラメタへのインジェクション
           @PathParam("path") String pathParam ) {
       String returnString = "PathParam: " + pathParam;
       return returnString;
   }
   
   //サンプル:サブリソースロケータ9
   //サブリソースクラスはURI "/root/subresourceLocator"でアクセスされる
   @Path("/subresourceLocator")
   public SubResource subResourceMethod9() {
       //サブリソースロケータはHTTPリクエストを処理するために
       //リソースクラスインスタンスを返す
       return new SubResource();
   }

   //サンプル:サブリソースメソッド10
   //  例外をスローする
   //スローされた例外は例外マッピングプロバイダによって
   //HTTPレスポンスにマッピングされる
   //このメソッドはHTTP GETリクエストを処理する
   @Path("/exception")
   //このメソッドはURI "/root/exception"でアクセスされる
   @GET
   public String subResourceMethodThrowingException() {
       throw new RuntimeException();
   }

   //サンプル: サブリソースメソッド11
   //  JSON形式のデータを処理する
   //このメソッドはHTTP POSTリクエストを処理する
   @Path("pojoJsonMapping")
   //このメソッドは URI "root/PojoJsonMapping"でアクセスされる
   @POST
   @Consumes(MediaType.APPLICATION_JSON)
   @Produces(MediaType.APPLICATION_JSON)
   public CustomType pojoJsonMappingMethod(CustomType record) {
       // クライアントから受け取ったrecordオブジェクトの内容を確認する
       if(!record.getName().equals("Old Record Name")){
           throw new RuntimeException();
       }
       List<Integer> oldGrades = new ArrayList<Integer>();
       oldGrades.add(1);
       oldGrades.add(2);
       oldGrades.add(3);
       if(!record.getGrades().equals(oldGrades)){
           throw new RuntimeException();
       }

       // クライアントに送り返すCustomTypeオブジェクトを新規に生成する
       CustomType newRecord = new CustomType();
       newRecord.setName("New Record Name");
       List<Integer> newGrades = new ArrayList<Integer>();
       newGrades.add(5);
       newGrades.add(6);
       newGrades.add(7);
       newRecord.setGrades(newGrades);

       return newRecord;
   }
}

作成したルートリソースクラス(Resource.java)は,UTF-8形式でc:¥temp¥jaxrs¥works¥tutorial¥server¥src¥com¥sample¥resources¥ディレクトリに保存します。

サブリソースクラスの作成例を次に示します。このサブリソースクラスはHTTP GETリクエストを受け付けるリソースメソッドを持ちます。なお,サブリソースクラスの作成は任意です。

package com.sample.resources;

import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;

//サンプル:サブリソースクラス
public class SubResource {

   //このメソッドはHTTP GETリクエストを処理する
   @GET
   public String getHandlerForSubResource(
           //サブリソースメソッドパラメタへの
           //ヘッダパラメタのインジェクション
           @HeaderParam("header") String headerParam) {
       return "Header: " + headerParam;
   }
}

作成したサブリソースクラス(SubResource.java)は,UTF-8形式でc:¥temp¥jaxrs¥works¥tutorial¥server¥src¥com¥sample¥resources¥ディレクトリに保存します。

例外マッピングプロバイダの作成例を次に示します。この例外マッピングプロバイダは,HTTPヘッダheaderに"RuntimeException occurs"の値を持つステータスコード501のHTTPレスポンスに,ランタイム例外をマッピングします。なお,例外マッピングプロバイダの作成は任意です。

package com.sample.providers;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ExceptionMapper;

//サンプル:例外マッピングクラス
//このクラスはRuntimeExceptionをHTTPレスポンスにマッピングする
@Provider
public class RuntimeExceptionMapper implements
       ExceptionMapper<RuntimeException> {
   //このメソッドはアプリケーションがランタイム例外を
   //スローしたときに呼び出される
   public Response toResponse(RuntimeException re) {
       //HTTPレスポンスのステータスとして"HTTP/1.1 501 Not Implemented"を
       //設定する
       //HTTPレスポンスのヘッダに"header: RuntimeException occurs"を
       //設定する
       return Response.status(501)
           .header("header", "RuntimeException occurs").build();
   }
}

作成した例外マッピングプロバイダ(RuntimeExceptionMapper.java)は,UTF-8形式でc:¥temp¥jaxrs¥works¥tutorial¥server¥src¥com¥sample¥providers¥ディレクトリに保存します。

JSON形式のデータにマッピングされるPOJOの作成例を次に示します。なお,JSONマッピング用のPOJOの作成は任意です。

package com.sample.resources;

import java.util.List;

public class CustomType {
   
   private String name;
   private List<Integer> grade;
   
   public CustomType() {
   }
   public CustomType (String name, List<Integer> grades){
       this.name = name;
       this.grade = grades;
   }
   public String getName() {
       return name;
   }
   public void setName(String name) {
       this.name = name;
   }
   public List<Integer> getGrades() {
       return grade;
   }
   public void setGrades(List<Integer> grades) {
       this.grade = grades;
   }
   @Override
   public String toString() {
       return "Record [Name=" + name + ", Grades=" + grade.toString() + "]";
   }
}

作成したJSONマッピング用のPOJO(CustomType.java)は,UTF-8形式でc:¥temp¥jaxrs¥works¥tutorial¥server¥src¥com¥sample¥resources¥ディレクトリに保存します。