これまでの記事はこちら。
- JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part1 - Jupitris on Laboratory
- JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part2 - Jupitris on Laboratory
- JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part3 - Jupitris on Laboratory
- JSONIC + Slim3 + GAE/JでRESTサービスを構築する方法 Part4 - Jupitris on Laboratory
今回は、JSONICのRESTサーブレットで、デフォルト以外のメソッドの定義の仕方について。
ここでいうデフォルトとは、WebサービスAPI (JSONIC 1.3)の下表で定義されている状態をいいます。
HTTP MethodとJava メソッド名のデフォルトのマッピングは次の通りです(※4)。
http://jsonic.sourceforge.jp/webservice.html#restservlet
HTTP Method Java メソッド名 引数 GET find リクエストパラメータを .
あるいは[]
で区切られた階層構造とみなし引数の型に従い変換し設定されます。POST create Content-Typeが「 application/json
」の時は、メッセージボディのJSON文字列を引数の型に従い変換し設定されます。
Content-Typeが「application/x-www-form-urlencoded
」の時はリクエストパラメータを.
あるいは[]
で区切られた階層構造とみなし引数の型に従い変換し設定されます。PUT update DELETE delete
今回扱う内容は公式ドキュメントを見ればわかることなんですが、自分は理解するのに少し時間がかかったので、同じようなことを実現したい人の参考になればなあと思います。
さて、早速ですが今回追加したいメソッドは、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.xmlはJSONIC + 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サービスを構築方法は終わり。正しく動作しない箇所があったら、コメントください。