Hitachi

Cosminexus V11 アプリケーションサーバ Webサービス開発ガイド


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

/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\ディレクトリに保存します。