12.3.1 ルートリソースクラスを作成する
ルートリソースクラスを作成します。ここでは,次のリソースメソッド,サブリソースメソッド,サブリソースロケータ,およびインジェクションの対象となるコンストラクタ,フィールド,beanプロパティを持つルートリソースクラスを作成します。
項目 |
要求メソッド識別子 |
/root以下のコンテキストパス |
備考 |
|
---|---|---|---|---|
リソースメソッド |
resourceMethod1 |
@GET |
− |
− |
resourceMethod7 |
@POST |
− |
|
|
サブリソースメソッド |
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\ディレクトリに保存します。