Android RestClientException: не подходит HttpMessageConverter не найден - PullRequest
7 голосов
/ 20 апреля 2011

Я использую spring android rest template и пытаюсь преобразовать ответ JSON в класс java, как показано здесь .

Вот мой фрагмент, пытающийся выполнить работу:

    RestTemplate restTemplate = new RestTemplate();
    restTemplate.getMessageConverters().add(new MappingJacksonHttpMessageConverter());

    //I have already tried to manually setting converters with no luck
    //List<HttpMessageConverter<?>> messageConverters = new ArrayList<HttpMessageConverter<?>>();
    //messageConverters.add(new MappingJacksonHttpMessageConverter());
    //messageConverters.add(new FormHttpMessageConverter());
    //messageConverters.add(new StringHttpMessageConverter());
    //restTemplate.setMessageConverters(messageConverters);

    Result result = restTemplate.getForObject(url, Result.class);

Я думаю, что я сделал все необходимое, как сказано в документе:

  • В моем classpath есть следующие jar
    • jackson-all-1.7.6.jar
    • spring-android-rest-template-1.0.0.M2.jar
  • url действительно возвращает объект JSON.
  • Мой Result класс - это POJO со всеми обязательными полями

По сути, наличие Jackson dependencies в моем classpath должно быть достаточным, чтобы оно заработало:* MappingJacksonHttpMessageConverter загружается условно при создании нового экземпляра RestTemplate.Если в вашем пути к классам найдены зависимости Джексона, конвертер сообщений будет автоматически добавлен и доступен для использования в операциях REST.

Так что мне здесь не хватает, что я делаю неправильно?

Спасибо

Полное исключение можно найти здесь:

04-20 04:25:52.706: ERROR/AndroidRuntime(9638): FATAL EXCEPTION: main
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): java.lang.IllegalStateException: Could not execute method of the activity
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$1.onClick(View.java:2083)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View.performClick(View.java:2421)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$PerformClick.run(View.java:8869)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Handler.handleCallback(Handler.java:587)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.os.Looper.loop(Looper.java:143)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.app.ActivityThread.main(ActivityThread.java:5068)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invoke(Method.java:521)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at dalvik.system.NativeStart.main(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): Caused by: java.lang.reflect.InvocationTargetException
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at xxx.SamplePageActivity.doRest(SamplePageActivity.java:83)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invokeNative(Native Method)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at java.lang.reflect.Method.invoke(Method.java:521)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at android.view.View$1.onClick(View.java:2078)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     ... 11 more
04-20 04:25:52.706: ERROR/AndroidRuntime(9638): Caused by: org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [[Lxxx.SamplePageActivity$Result;] and content type [application/json;charset=UTF-8]
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:77)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:449)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:404)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:202)
04-20 04:25:52.706: ERROR/AndroidRuntime(9638):     ... 15 more

Ответы [ 4 ]

2 голосов
/ 11 ноября 2011

Я никогда ничего не делал на Android, но я знаю, что конверты требовательны к Content-Type. Чтобы Джексон работал, тело сообщения должно иметь 'Content-Type: application / json ' Попробуйте проверить все заголовки в ответе.

1 голос
/ 09 октября 2013

Для меня эта ошибка была выдана для класса, который использовал бы тип enum вместо String для определенного свойства.

Другая причина также может заключаться в том, что вы используете Jackson 2. Вы должны затемизменить на MappingJackson2HttpMessageConverter (вместо MappingJacksonHttpMessageConverter).

1 голос
/ 05 апреля 2013

Я встретил то же исключение и исправил его сейчас.

Основная причина

На сервере я настраивал ответ следующим образом:

response.setContentType("text/html;charset=utf-8");

Решение

Я обновил contentType следующим образом:

response.setContentType("application/json;charset=utf-8");
0 голосов
/ 16 апреля 2013

Вот что у меня сработало в похожей ситуации:

HttpHeaders requestHeaders = new HttpHeaders (); // Отправка многочастному / форм-данных, requestHeaders.setContentType (MediaType.MULTIPART_FORM_DATA);

// Заполняем сериализуемую MultiValueMap и заголовки в HttpEntity объект для использования в запросе HttpEntity> requestEntity = new HttpEntity> (parts, requestHeaders);

RestTemplate restTemplate = getRestTemplate (); restTemplate.getMessageConverters (). Добавить (новый FormHttpMessageConverter ()); restTemplate.getMessageConverters (). Добавить (новый MappingJackson2HttpMessageConverter ());

вернуть restTemplate.postForObject (URI, requestEntity, APIResponseUpload.class);

...