あん☆すたをボチボチ触ってます。@ryosmsです

さて、楽天ウェブサービスの返すJsonが凶悪なことは割りと有名だと思いますが、
このJsonがAndroidAnnotationsのRest API機能と非常に相性が悪くて困ります。

どれくらい相性が悪いかと言うと、普通にGsonを使用(converters = {GsonHttpMessageConverter.class})して、叩いても以下のExceptionが出て変換できないレベルです。
org.springframework.web.client.RestClientException:
Could not extract response: no suitable HttpMessageConverter found for response type [your.package.HogeClass] and content type [text/html;charset=UTF-8] 
いろいろあってなんとか解決したのでメモ


最初はAndroidAnnotationsの@Acceptを使用してtext/htmlを許可すればいいのかと思いましたが、これではダメでした。
というわけで、自分でカスタムConverterを作って解決しました。

AndroidAnnotationsのRest API機能はSpring frameworkを使用して作られています。
カスタムConverterはorg.springframework.http.converter.AbstractHttpMessageConverterを継承して作るらしいです。 #知らんけど
上述のGsonHttpMessageConverterもAbstractHttpMessageConverterを継承しています

今回はAbstractHttpMessageConverterを継承して作るのはめんどくさいし、楽天から返されるJsonが変換できればそれでOKなので、GsonHttpMessageConverterを継承してカスタムConverterを作ります。

最初はちゃんと許可するMediaTypeを指定できるようにしようとかいろいろ考えたりしたけど、楽天の凶悪なJsonを変換するためだけにそこまでするのもめんどくさいので、MediaTypeをチェックしないようにしました。

で、できあがったものがこちらになります→ ryosms / RakutenGsonConverter.java - Gist

というわけでもっといい方法があるよ!とかあれば教えてください。


P.S. それにしてもしばらくAndroid触ってなかったらアカンわ