android RestClientException: подходящий HttpMessageConverter не найден

Я использую 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);

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

  • I have following jars in my classpath
    • jackson-all-1.7.6.jar
    • весна-андроид-отдых-шаблон-1.0.0.M2.jar
  • url действительно возвращает объект JSON.
  • Мой класс Result представляет собой POJO со всеми необходимыми полями.

По сути, наличия Jackson dependencies в моем пути к классам должно быть достаточно, чтобы заставить его работать, как он говорит:

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

person dds    schedule 20.04.2011    source источник
comment
это очень интересно. Я хотел бы услышать ответ.   -  person aykut    schedule 03.05.2011


Ответы (4)


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

person Andreas Wederbrand    schedule 11.11.2011
comment
вау, это было давно, и я точно не помню, как я это исправил, но это было что-то вроде того, что вы предложили, на самом деле я использовал application/json :) - person dds; 15.11.2011
comment
У меня та же проблема, но я не могу изменить тип контента, так как мои API являются сторонними API. Есть ли альтернатива, кроме изменения типа контента? - person Yasitha Waduge; 11.03.2014

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

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

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

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

Решение

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

response.setContentType("application/json;charset=utf-8");
person caiying    schedule 05.04.2013

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

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

person Risadinha    schedule 09.10.2013

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

HttpHeaders requestHeaders = new HttpHeaders(); // Отправка multipart/form-data requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

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

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

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

person deepwinter    schedule 16.04.2013