ルートリソースクラスを作成します。ここでは,次のリソースメソッド,サブリソースメソッド,サブリソースロケータ,およびインジェクションの対象となるコンストラクタ,フィールド,beanプロパティを持つルートリソースクラスを作成します。
表12-3 作成するルートリソースクラス
項目 | 要求メソッド識別子 | /root以下のコンテキストパス | 備考 |
---|
リソースメソッド | resourceMethod1 | @GET | - | - |
resourceMethod7 | @POST | - | - フォーム値をインジェクトするFormParamアノテーションでアノテートされたパラメタを持ちます。
- MIMEタイプ"*/*"のHTTPエンティティを受け取ります。
- MIMEタイプ"application/xml"のHTTPエンティティを返します。
|
サブリソースメソッド | subResourceMethod2 | @GET | /getQueryParam | - |
subResourceMethod3 | @POST | /getUriInfoAndEntity | エンティティパラメタを持ちます。 |
subResourceMethod4 | @GET | /getHttpHeaders | HttpHeadersをインジェクトするContextアノテーションでアノテートされたパラメタを持ちます。 |
subResourceMethod5 | @GET | /getMatrixParam | マトリクスパラメタをインジェクトするMatrixParamアノテーションでアノテートされたパラメタを持ちます。 |
subResourceMethod6 | @GET | /getCookieParam | CookieをインジェクトするCookieParamアノテーションでアノテートされたパラメタを持ちます。 |
subResourceMethod8 | @GET | /getPathParam | パスパラメタをインジェクトするPathParamアノテーションでアノテートされたパラメタを持ちます。 |
subResourceMethod ThrowingException | @GET | /{path:[A-Z][a-z]+}/exception | 例外をスローします。スローされた例外は例外マッピングプロバイダRuntimeExceptionMapperによってHTTPエンティティにマッピングされます。 |
pojoJsonMappingMethod | @POST | /pojoJsonMapping | JSON形式のデータを処理します。 |
サブリソースロケータ | 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¥ディレクトリに保存します。