Jersey で JSON を受ける
以前、Jersey で REST サーバーを作ったときに、JSON の扱いがあいまいだったが、使い方がわかったのでメモ。
@XmlRootElement public class MessageInfo { @XmlElement public String message; @XmlElement public String level; }
があったとき、
@PUT @Path("/test") @Produces(MediaType.APPLICATION_JSON) public Response test(MessageInfo msg){ Response ret = Response.serverError().build(); try { ret = Response.created(new URI(request.getRequestURI())).build(); } catch ( Exception ex ){ ex.printStackTrace(); } return ret; }
は、標準入力へ、
<?xml version="1.0" encoding="UTF-8" ?> <messageInfo> <level>レベル</level> <message>メッセージ</message> </messageInfo>
を送れば、これを受けられるのだが、
{"messageInfo":{"level":"レベル","message":"メッセージ"}}
だと受けられない。これを受けられるようにするためには、以下のように、
@PUT @Path("/test") @Consumes({MediaType.APPLICATION_JSON , MediaType.APPLICATION_XML}) @Produces(MediaType.APPLICATION_JSON) public Response test(MessageInfo msg){ Response ret = Response.serverError().build(); try { ret = Response.created(new URI(request.getRequestURI())).build(); } catch ( Exception ex ){ ex.printStackTrace(); } return ret; }
@Consumes を追加すると、受けられる。
ただ、Jersey のライブラリが足りないと、よくわからない例外で怒られる。例外は、電文が知っている形式に変換できないといっているようなので、以下の jar 、
jackson-core-asl-1.9.2.jar jackson-jaxrs-1.9.2.jar
を追加すると、めでたく、msg に JSON がマッピングされる。
なお、JSON は、
{"level":"レベル","message":"メッセージ"}
のようにルートの要素がなくても、正常に受けられ、JSON にマッピングできました。
文字列型で受けて、JSON に変換するという方法が、よく見受けられるので、こういうやり方もあると備忘を兼ねて。(それだとXML を受けられなくなってしまう)
ごきげんよう。