исключение Android RestClientException: не найден подходящий HttpMessageConverter

#android #spring #rest #resttemplate

#Android #spring #rest #resttemplate

Вопрос:

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

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

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

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

MappingJacksonHttpMessageConverter загружается условно при создании нового экземпляра RestTemplate. Если зависимости Джексона найдены в вашем classpath, конвертер сообщений будет автоматически добавлен и доступен для использования в операциях 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$Resu<] 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
  

Комментарии:

1. это очень интересно. Я хотел бы услышать ответ.

Ответ №1:

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

Комментарии:

1. вау, прошло некоторое время, и я не помню точно, как я это исправил, но это было что-то вроде того, что вы предложили, на самом деле я использовал application / json 🙂

2. У меня такая же проблема, но я не могу изменить тип контента, поскольку мои API являются сторонними API. Есть ли какая-либо альтернатива, кроме изменения типа контента?

Ответ №2:

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

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

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

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

Решение

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

 response.setContentType("application/json;charset=utf-8");
  

Ответ №3:

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

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

Ответ №4:

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

HttpHeaders requestHeaders = new HttpHeaders(); // Отправка составных /form-data requestHeaders requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);

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

RestTemplate RestTemplate = getRestTemplate(); RestTemplate.getMessageConverters().add(новая формаhttpmessageconverter()); RestTemplate.getMessageConverters().add(новый MappingJackson2HttpMessageConverter());

верните RestTemplate.postForObject(URI, requestEntity, APIResponseUpload.class );