4


サーバーにPOSTリクエストを送信したい。JSONオブジェクトをパラメーターとして渡し、JSONを応答として取得する必要がありますが、次のエラーが発生します。

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [com.package.Response] and content type [application/octet-stream]

コード

送信リクエスト:

    @RestService
    RestClient restClient;
...
    String json = "{\"param\":3}"; 
    restClient.getRestTemplate().getMessageConverters().add(new GsonHttpMessageConverter());
    Response res = restClient.send(json);

RestClient

@Rest("http://my-url.com")

    public interface RestClient
    {
        @Post("/something/")
        Response send(String json);

        RestTemplate getRestTemplate();

        void setRestTemplate(RestTemplate restTemplate);
    }

私はこれらのJARファイルを使用しています:

  • spring-android-rest-template-1.0.0.RC1
  • 春-android-core-1.0.0.RC1
  • 春-android-auth-1.0.0.RC1
  • gson-2.2.2

私が間違っているのは何ですか?パラメータを
に変更すると、同じエラーが発生します。 ところで。AAドキュメントは本当に謎めいたものです-とにかくGsonを使用できますか?それともジャクソンを使うべきですか?その場合、どのファイルを含める必要がありますか? 助けてくれてありがとう!sendJSONObject




4

3 に答える 3

4

RestTemplateは、GsonまたはJacksonのいずれかで使用できます。

Gsonは問題なく、小さなjsonデータセットを使用すると使いやすくなります。複雑で深いjsonツリーがある場合は、Jacksonの方が適しています。これは、Gsonが多くの一時オブジェクトを作成し、それがワールドGCの停止につながるためです。

HttpMessageConverterここでのエラーは、解析できるものが見つからないことを示していますapplication/octet-stream

GsonHttpMessageConverterのソースを見ると、mimetypeのみをサポートしていることがわかりますapplication/json

これは、2つのオプションがあることを意味します。

  • コンテンツからmimetypeを返すかapplication/json、これは非常に適切なシームになります
  • または、サポートされているメディアタイプを変更するだけGsonHttpMessageConverterです。
String json = "{\"param\":3}"; 
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setSupportedMediaTypes(new MediaType("application", "octet-stream", Charset.forName("UTF-8")));
restClient.getRestTemplate().getMessageConverters().add(converter);
Response res = restClient.send(json);
于 2012-09-14T14:53:24.283 に答える
0

私はちょうどこの問題を抱えていました。数時間後、RestTemplate.postForObject呼び出しに渡したクラスにDate変数があることに気付きました。単純なデータ型のみが含まれていることを確認する必要があります。これが他の誰かに役立つことを願っています!

于 2014-03-11T11:10:30.713 に答える
0

動作させるために少し変更する必要があります。

final List<MediaType> list = new ArrayList<>();
list.addAll(converter.getSupportedMediaTypes());
list.add(MediaType.APPLICATION_OCTET_STREAM);
converter.setSupportedMediaTypes(list);
于 2016-03-01T12:42:20.823 に答える