2012-09-13 4 views
4


Я хочу отправить запрос POST на сервер. Я должен передать объект JSON в качестве параметра, и получить JSON в качестве ответа, но я получаю эту ошибку:Клиент для отдыха с AndroidAnnotations - «нет подходящего HttpMessageConverter ...»

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
  • gson-2,2 .2

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

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

ответ

4

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

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

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

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

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

  • либо вернуть application/json MimeType от контента, который бы шов вполне уместно
  • Или просто изменить поддерживаемые типы носителей на 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); 
+0

Спасибо вам большое!Будет ли новая версия аннотации поддержки AA для HttpMessageConverters? – Piotr

+1

Да, это часть плана :) –

+0

Прохладный, спасибо Piwaï. Просто немного больше информации, если другим это нужно: чтобы добавить это, я удалил автоматически созданный-от-интерфейс RestClient и использовал сгенерированный класс в качестве основы, а затем добавил код Piwaï выше в конструктор. За исключением меня, setSupportedMediaTypes принимает список MediaTypes, поэтому я сначала добавил MediaType в список. Вы можете переключить \ @RestClient для \ @EBean и ссылаться на свой класс с помощью \ @Bean. Работал для меня в любом случае! :) – poshaughnessy

0

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

0

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

final List<MediaType> list = new ArrayList<>(); 
list.addAll(converter.getSupportedMediaTypes()); 
list.add(MediaType.APPLICATION_OCTET_STREAM); 
converter.setSupportedMediaTypes(list); 
Смежные вопросы