あん☆すたをボチボチ触ってます。@ryosmsです
さて、楽天ウェブサービスの返すJsonが凶悪なことは割りと有名だと思いますが、
このJsonがAndroidAnnotationsのRest API機能と非常に相性が悪くて困ります。
どれくらい相性が悪いかと言うと、普通にGsonを使用(converters = {GsonHttpMessageConverter.class})して、叩いても以下のExceptionが出て変換できないレベルです。
さて、楽天ウェブサービスの返す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触ってなかったらアカンわ
というわけで、自分でカスタム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触ってなかったらアカンわ
コメント