shin'nosuke さんのアレグロモデラート

アレグロモデラート(Allegro moderato)は、速さを示す演奏記号で「穏やかに速く」

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 を受けられなくなってしまう)

ごきげんよう。