読者です 読者をやめる 読者になる 読者になる

Jersey(JAX-RS)でリストの要素が一つしかない場合にレスポンスのjson内の値が配列じゃなくなっちゃう問題の対応

f:id:saihoooooooo:20071226161622j:plain

タイトル長いですが、読んで字の如くです。
例えばこんなクラスがあるとします。

@XmlRootElement
public class MyResponse {

    private List<String> list;

    public List<String>getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

}

このクラスをレスポンスとして返した時、複数の要素がある場合はこうなりますが。

{
    "list": ["fukusu", "aruyo"]
}

要素が一つしかないとこうなる。

{
    "list": "hitotsudake"
}

お前リストやったんちゃうんかい、と。

まぁ別にデータが破損してるわけじゃないんだけど、読み取る側で分岐を入れないといけないとか割とクソ感あります。
「これ直すのに結構奥深くまで手入れないといけないんだろうなぁ・・・」と思いながらグーグル先生に訊いてみると、stackoverflowにそのものズバリな回答がありました。


How can I customize serialization of a list of JAXB objects to JSON? - Stack Overflow

要するにweb.xmlの<servlet>タグに以下のパラメータを追加するだけでいいと。
「your.project.packages」の部分は各自の環境に合わせて書き換えてください。

<init-param>
  <param-name>com.sun.jersey.config.property.packages</param-name>
  <param-value>your.project.packages;org.codehaus.jackson.jaxrs</param-value>
</init-param>

たったこれだけで、ねんがんのレスポンスをてにいれることができました。

{
    "list": ["hitotsudake"]
}

コードの追加、修正が全くなくて得した気分です。