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:
- Rest Client con AndroidAnnotations - "no HttpMessageConverter adecuado ..."
- Cómo configurar un entorno de desarrollo de Android con STS, Android SDK, Maven y Spring Android
- Establecer encabezados utilizando resorte android resttemplate y anotaciones android
- No se pudo escribir la solicitud: no se encontró HttpMessageConverter adecuado para el tipo de solicitud y el tipo de contenido
- Enviar archivo multiparte a través de RestTemplate
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
- Spring RestTemplate: publicar una imagen y un objeto al mismo tiempo
- Realización de solicitudes POST autenticadas con Spring RestTemplate para Android
- Cómo enviar x-www-form-urlencoded en un cuerpo de solicitud de POST utilizando anotaciones android y resttemplate
- HTTP get con encabezados usando RestTemplate
- Android: cómo recuperar el objeto JSON en caso de una excepción con RoboSpice
- ClassCastException: RestTemplate devuelve Lista <LinkedHashMap> en lugar de List <MymodelClass>
- La clase de error de serialización de Gson com.activeandroid.DatabaseHelper declara varios campos JSON llamados mContext
- Intellij 12 maven library Android Problema de RestTemplate que procesa javax / xml / parser / DocumentBuilder.class
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);
- Multidex Android, UnsatisfiedLinkError – no pudo encontrar el archivo .so
- Cómo activar programaticamente la opción Autostart para mi aplicación en la aplicación de seguridad de MI 4i?