#navi_header|Java| [[1308]] に引き続き、JerseyでJSONのリクエストを受け取ったり、JSONレスポンスを出力するやり方を調べてみました。 これもmultipartの例と同様、JAX-RS自体の仕様には含まれておらず、ライブラリやフレームワーク側でProviderなどのショートカット用のクラス・メソッドを用意してくれている状況です。 Jersey 2.x系: - Chapter 8. Support for Common Media Type Representations -- https://jersey.java.net/documentation/latest/media.html#json.jackson --- 公式でサポートもされているが、ObjectMapper周りの細かい調整をどこですれば良いのか分からない。 - JAX-RSとかの話 — 裏紙 -- http://backpaper0.github.io/2013/05/02/jaxrs.html --- JSONを扱う例について軽く触れられている。 ただしこの辺は、実務で使うとおもいっきりアプリ独自色に引きずられる場所なので、あまりライブラリやフレームワーク側のお仕着せやショートカットに依存させたくありませんでした。 そのため、MessageBodyReader/Writerを自作して、好きなJSONライブラリで好きなようにRead/Writeできる方式を今回は試してみました。 参考: - Jersey、JSONでボディマッピングの実装 - ぺーぺーSEの日記 -- http://d.hatena.ne.jp/tanakakns/20130918/1379513591 --- Jersey 1.x の時代になるが、MessageBodyReader, MessageBodyWriterを使ってJacksonのObjectMapperによりread/writeするProviderを自作する例がある。 --- Jersey 2.x では多少修正の必要があるが、ほぼそのまま移植でき、一番緩い Map に簡単に載せ替えることができた。 - Java:JacksonをつかってJSONを読み込む - HiiHahWIKI - making some notes for... - -- http://www.hiihah.info/index.php?Java%EF%BC%9AJackson%E3%82%92%E3%81%A4%E3%81%8B%E3%81%A3%E3%81%A6JSON%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%82%80 --- ObjectMapperを使って、Beanに頼らず、MapやListだけでゆるーく扱う例。 ということで、一番ゆるゆるに扱えるMap形式でJacksonにてMessageBodyReader/Writerを作ってみた例が以下になります。ぶっちぇけ前掲の "Jersey、JSONでボディマッピングの実装" のパクリ・・・です・・・。 → https://github.com/msakamoto-sf/jaxrs2-exercise-jersey-servlet/commit/169c9bbbeb45994ca37c90797ef9e011bbfa4891 ポイントとしては、MapではなくLinkedHashMap にしているところです。 実は最初は、「Mapでイインジャネ?」とMapにしてたんですが・・・ObjectMapperのreadValue()、Mapでパースした場合、実装型としてはLinkedHashMapのインスタンス返してくるんですよね・・・。 なので、MessageBodyWriterのisWritable()メソッドのtype引数がLinkedHashMap.classになってしまうので、そちらで合わせる必要が出てきました。 そうすると、リソースクラスで、戻り値だけLinkedHashMapで、引数がMapというのもバランスがおかしいように見えてきます。 → というわけで、最終的に全部LinkedHashMapに揃えた次第です。 あんまりBean作りまくって厳密に型にはめる必要がなければ、一番ゆるゆるなMap形式でも良い意味で手抜きできますので、一応今回はそのケースで試してみました。 #navi_footer|Java|