Rest Client с AndroidAnnotations - нет подходящего HttpMessageConverter


Я хочу отправить 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:

  • весна-андроид-остального-шаблон-1.0.0.RC1
  • весна-андроид-ядро-1.0.0.RC1
  • весна-андроид-аутентификация-1.0.0.RC1
  • гсон-2.2.2

Что я делаю неправильно?
Когда я изменяю параметр send на JSONObject, я получаю ту же ошибку.
Кстати. Документы AA действительно загадочны - могу ли я использовать Gson в любом случае?
Или я должен использовать Джексона?
Какой файл мне тогда нужно включить?

Спасибо за любую помощь!


person Piotr    schedule 13.09.2012    source источник


Ответы (3)


Вы можете использовать RestTemplate с Gson или Jackson.

Gson удобен и прост в использовании, если у вас небольшой набор данных json. Джексон больше подходит, если у вас сложное/глубокое дерево json, потому что Gson создает много временных объектов, что приводит к остановке мирового GC.

Ошибка здесь говорит о том, что он не может найти HttpMessageConverter, способный анализировать application/octet-stream.

Если вы посмотрите на исходники для GsonHttpMessageConverter вы заметите, что он поддерживает только mimetype application/json.

Это означает, что у вас есть два варианта:

  • Либо верните 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);
person Pierre-Yves Ricau    schedule 14.09.2012
comment
Спасибо большое! Будет ли новая версия AA поддерживать аннотации для HttpMessageConverters? - person Piotr; 14.09.2012
comment
Да, это часть плана :) - person Pierre-Yves Ricau; 25.09.2012
comment
Круто, спасибо Piwaï. Еще немного информации на случай, если это понадобится другим: чтобы добавить это, я отказался от автоматически сгенерированного из интерфейса RestClient и использовал сгенерированный класс в качестве основы, а затем добавил приведенный выше код Piwaï в конструктор. За исключением меня, setSupportedMediaTypes принимает список MediaTypes, поэтому я сначала добавил MediaType в список. Затем вы можете переключить \@RestClient на \@EBean и ссылаться на свой класс с помощью \@Bean. Во всяком случае, сработало для меня! :) - person poshaughnessy; 05.01.2013

У меня только что была эта проблема. Через несколько часов я понял, что класс, который я передал вызову RestTemplate.postForObject, имел переменные Date. Вы должны убедиться, что он содержит только простые типы данных. Надеюсь, это поможет кому-то еще!

person Rob    schedule 11.03.2014

Мне нужно немного изменить его, чтобы он работал:

final List<MediaType> list = new ArrayList<>();
list.addAll(converter.getSupportedMediaTypes());
list.add(MediaType.APPLICATION_OCTET_STREAM);
converter.setSupportedMediaTypes(list);
person Ivan    schedule 01.03.2016