第47夜 JAX-RSをWebアプリのフロントエンドとして利用する その4
さて、JAX-RSで返すものはHTMLやTEXTだけではないはずだ。AJAXではJSONはよく使われる。これがシンプルに返せるのがいい。
JAX-RSにはもちろんそれを生成する能力はある。
JAX-RSの参照実装であるJerseyはオブジェクトをシリアライズする方法が2つある。
1つ目はJAXBを利用する方法。これは以前紹介した。
JSONはJettison経由で変換する。JettisonはあくまでもJAXBを経由、つまりXMLを経由するわけだ。そのため、無指定だと数字型もなにもかもダブルクォーテーションがついて文字列型になってしまう。かといって毎回個別に設定するのは手間だ。
そこで2つ目の方法を紹介する。
それはJacksonを利用する。
Jacksonは超高速名JSONパーサで有名なので知っている人も多いと思う。JAX-RSの依存jarにJacksonが含まれているのに気がついた人もいるだろう。
使い方はいたってシンプルだ。
コードを見たほうが早いか。
まず設定。servletの初期化部分。web.xmlね。もちろん動的に追加してもよい(JavaEE6はそれができる)。
<init-param> <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> <param-value>true</param-value> </init-param>
これだけ。
DTO。
public class UserData{ public int id; public String name; }
publicフィールドでよい。アノテーションも何もいらない。
@Path("index") public class Index { @GET @Produces(MediaType.APPLICATION_JSON) public UserData get(){ UserData userData = new UserData(); userData.id = 123; userData.name = "なまえ"; return userData; } }
MIMEをapplication/jsonに指定して(このサンプルのように定数が用意されてるのでそれを使うとよい)インスタンスを返すだけ。
はい、らくちんですね!
もちろん
@GET @Produces(MediaType.APPLICATION_JSON) public List<UserData> get(){ //省略 }
みたいにコレクションで返してもいいし、
@POST @Consumes(MediaType.APPLICATION_JSON) public void post(UserData inputUserData){ //省略 } }
みたいにJSONを受け取ることも出来る。