Android RestClientException: no se ha encontrado HttpMessageConverter adecuado

Estoy usando la spring android rest template y tratando de convertir una respuesta JSON en una clase java como se muestra aquí .

Aquí está mi fragmento tratando de hacer el trabajo:

  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); 

Creo que he hecho todo lo necesario como se dice en el documento:

  • Tengo siguientes tarros en mi classpath
    • Jackson-all-1.7.6.jar
    • Spring-android-rest-template-1.0.0.M2.jar
  • La url realmente devuelve un objeto JSON.
  • Mi clase Result es un POJO con todos los campos requeridos

Básicamente tener las Jackson dependencies en mi classpath debe ser suficiente para que funcione como dice:

El MappingJacksonHttpMessageConverter se carga condicionalmente cuando crea una nueva instancia de RestTemplate. Si las dependencias de Jackson se encuentran en su classpath, el convertidor de mensajes se agregará automáticamente y estará disponible para su uso en operaciones REST.

Así que lo que me falta aquí, lo que estoy haciendo mal?

Gracias

Se puede encontrar una excepción completa aquí:

 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 

Nunca he hecho nada en Android, pero sé que los conversos son exigentes con Content-Type. Para que Jackson funcione, el cuerpo del mensaje necesita tener 'Content-Type: application / json '. Trate de comprobar todos los encabezados de la respuesta.

He encontrado la misma excepción y lo arreglé ahora.

Causa principal

En el servidor, estaba estableciendo la respuesta como esta:

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

Solución

He actualizado el contentType como este:

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

Para mí, este error fue lanzado para una clase que usaría un tipo de enumeración en lugar de una cadena para una determinada propiedad.

La otra causa también podría ser que está utilizando Jackson 2. Debería cambiar a MappingJackson2HttpMessageConverter (en lugar de MappingJacksonHttpMessageConverter ).

Esto es lo que funcionó para mí en una situación similar:

HttpHeaders requestHeaders = nuevo HttpHeaders (); // Envío de solicitudes multipart / form-requestHeaders.setContentType (MediaType.MULTIPART_FORM_DATA);

// Rellene el MultiValueMap que está siendo serializado y los encabezados en un objeto HttpEntity para usar para la solicitud HttpEntity> requestEntity = new HttpEntity> (parts, requestHeaders);

RestTemplate restTemplate = getRestTemplate (); RestTemplate.getMessageConverters (). Add (nuevo FormHttpMessageConverter ()); RestTemplate.getMessageConverters (). Add (nuevo MappingJackson2HttpMessageConverter ());

Return restTemplate.postForObject (URI, requestEntity, APIResponseUpload.class);

  • No se puede deserializar la instancia de java.lang.String fuera de START_ARRAY
  • Cómo enviar una solicitud getForObject con parámetros Spring MVC
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.