home Glamenv-Septzen(ぐらめぬ・ぜぷつぇん)(archive)

Java/JAX-RS/JerseyでJSONリクエスト/レスポンスをJacksonのObjectMapperでLinkedHashMap<String, Object>でテキトーに読み書きするには

作成日: 2014-08-10 22:24:00   /   last updated at: 2014-08-10 22:54:02
カテゴリ: JAX-RS Java Jersey 

Java/JAX-RS/Jerseyでmultipartのリクエストを受け取るには に引き続き、JerseyでJSONのリクエストを受け取ったり、JSONレスポンスを出力するやり方を調べてみました。

これもmultipartの例と同様、JAX-RS自体の仕様には含まれておらず、ライブラリやフレームワーク側でProviderなどのショートカット用のクラス・メソッドを用意してくれている状況です。

Jersey 2.x系:

ただしこの辺は、実務で使うとおもいっきりアプリ独自色に引きずられる場所なので、あまりライブラリやフレームワーク側のお仕着せやショートカットに依存させたくありませんでした。
そのため、MessageBodyReader/Writerを自作して、好きなJSONライブラリで好きなようにRead/Writeできる方式を今回は試してみました。

参考:

ということで、一番ゆるゆるに扱えるMap<String, Object>形式でJacksonにてMessageBodyReader/Writerを作ってみた例が以下になります。ぶっちぇけ前掲の "Jersey、JSONでボディマッピングの実装" のパクリ・・・です・・・。

https://github.com/msakamoto-sf/jaxrs2-exercise-jersey-servlet/commit/169c9bbbeb45994ca37c90797ef9e011bbfa4891

ポイントとしては、Map<String, Object>ではなくLinkedHashMap<String, Object> にしているところです。
実は最初は、「Mapでイインジャネ?」とMap<String, Object>にしてたんですが・・・ObjectMapperのreadValue()、Map<String, Object>でパースした場合、実装型としてはLinkedHashMapのインスタンス返してくるんですよね・・・。
なので、MessageBodyWriterのisWritable()メソッドのtype引数がLinkedHashMap.classになってしまうので、そちらで合わせる必要が出てきました。
そうすると、リソースクラスで、戻り値だけLinkedHashMapで、引数がMapというのもバランスがおかしいように見えてきます。
→ というわけで、最終的に全部LinkedHashMapに揃えた次第です。

あんまりBean作りまくって厳密に型にはめる必要がなければ、一番ゆるゆるなMap<String, Object>形式でも良い意味で手抜きできますので、一応今回はそのケースで試してみました。


original url: https://www.glamenv-septzen.net/view/1309