home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

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

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

Java / JAX-RS / JerseyでJSONリクエスト / レスポンスをJacksonのObjectMapperでLinkedHashMap<String, Object>でテキトーに読み書きするには
id: 1309 所有者: msakamoto-sf    作成日: 2014-08-10 22:24:00
カテゴリ: 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>形式でも良い意味で手抜きできますので、一応今回はそのケースで試してみました。



プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2014-08-10 22:54:02
md5:b74c050ea4a1bb11a2f5fc12fa176f5d
sha1:7b4577ffe7067de7dea883349ba5e8a70913d274
コメント
コメントを投稿するにはログインして下さい。