Jersey(JAX-RS)でリストの要素が一つしかない場合にレスポンスのjson内の値が配列じゃなくなっちゃう問題の対応
タイトル長いですが、読んで字の如くです。
例えばこんなクラスがあるとします。
@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"] }
コードの追加、修正が全くなくて得した気分です。