第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が含まれているのに気がついた人もいるだろう。


使い方はいたってシンプルだ。

  • Jacksonを有効にするオプションを設定する。
  • DTOを作る(publicフィールドでよい)。
  • DTOを戻り値に設定、application/jsonで返す。

コードを見たほうが早いか。

まず設定。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フィールドでよい。アノテーションも何もいらない。


上のDTOJSONでかえすリソースクラス。

@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を受け取ることも出来る。


つまりDTO<=>JSON変換には何も気を使わなくていいということ。