JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part5

これまでの記事はこちら。

今回は、JSONICのRESTサーブレットで、デフォルト以外のメソッドの定義の仕方について。
ここでいうデフォルトとは、WebサービスAPI (JSONIC 1.3)の下表で定義されている状態をいいます。

HTTP MethodとJava メソッド名のデフォルトのマッピングは次の通りです(※4)

HTTP MethodJava メソッド名引数
GETfindリクエストパラメータを.あるいは[]で区切られた階層構造とみなし引数の型に従い変換し設定されます。
POSTcreateContent-Typeが「application/json」の時は、メッセージボディのJSON文字列を引数の型に従い変換し設定されます。

Content-Typeが「application/x-www-form-urlencoded」の時はリクエストパラメータを.あるいは[]で区切られた階層構造とみなし引数の型に従い変換し設定されます。
PUTupdate
DELETEdelete

(※4) ブラウザなどでは、PUT/DELETEが使えない場合があります。そのような場合の代替手段として、クエリ変数に「_method=HTTP Method名」を指定することもできます。

http://jsonic.sourceforge.jp/webservice.html#restservlet

今回扱う内容は公式ドキュメントを見ればわかることなんですが、自分は理解するのに少し時間がかかったので、同じようなことを実現したい人の参考になればなあと思います。

さて、早速ですが今回追加したいメソッドは、idでレコードを検索できる「findById」というメソッドです。idは、com.google.appengine.api.datastore.Keyクラスのプロパティ「id」になります。まずは、GreetingControllerクラスに、下記のメソッドを追加します。

/**
 * Returns the <code>Messages</code> which is found by the id.
 * 
 * @param param
 *            the id for finding data.
 * @return <code>Messages</code> if record was found, otherwise null.
 */
public Messages findById(Map<String, Object> param) {
    return logic.findByKey(Long.valueOf(param.get("id").toString()));
}

次に、GreetingLogicインターフェースに、下記のメソッドを追加します。

/**
 * Returns the message which is found by the id.
 * 
 * @param id
 *            the id for finding data.
 * @return message if record was found, otherwise null.
 */
Messages findByKey(Long id);

そしてGreetingLogicImplクラスに、下記のメソッドを追加します。

/*
 * (non-Javadoc)
 * 
 * @see com.example.logic.GreetingLogic#findByKey(java.lang.Long)
 */
@Override
public Messages findByKey(Long id) {
    Key key = Datastore.createKey(Messages.class, id);
    return Datastore.get(meta, key);
}

Javaの修正は以上で、最後にweb.xmlを修正します(元のweb.xmlJSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part2 - Jupitris on Laboratoryを参照)。下記の通りに修正してください。

<servlet>
    <servlet-name>restServlet</servlet-name>
    <servlet-class>net.arnx.jsonic.web.RESTServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>
            {
                "debug": true,
                "mappings": {
                    "/restapp/{class}.json":"com.example.controller.${class}Controller",
                    "/restapp/{class}/{id:[0-9]+}.json":{
                        "target": "com.example.controller.${class}Controller",
                        "method": {"GET": "findById"},
                        "verb": [ "GET" ]
                    }
                }
            }
        </param-value>
    </init-param>
</servlet>

下の部分が追加した内容になります。

"/restapp/{class}/{id:[0-9]+}.json":{
    "target": "com.example.controller.${class}Controller",
    "method": {"GET": "findById"},
    "verb": [ "GET" ]
}

これでひと通りの修正は完了です。http://localhost:8080/restapp/greeting/2.jsonという感じでアクセスすると、一件だけヒットするはずです。2.jsonの部分は、存在するidに変更してください。

以上で、JSONIC + Slim3 + GAE/JによるRESTサービスを構築方法は終わり。正しく動作しない箇所があったら、コメントください。