No se puede deserializar instancia de objeto de START_ARRAY token en Spring 3 REST Webservice
Estoy haciendo uso de esta cosa fresca ofertas de primavera: primavera RESTWebService (versión de primavera es 3). Si accedo a la URL desde el navegador, puedo ver la respuesta de JSON, pero desde un punto final de cliente (aplicación Android) recibo este mensaje de error:
Caused by: org.springframework.web.client.ResourceAccessException: I/O error: Can not deserialize instance of MyObject out of START_ARRAY token at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, column: 1]; nested exception is org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of MyObject out of START_ARRAY token at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, column: 1] at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:466) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:414) at org.springframework.web.client.RestTemplate.getForEntity(RestTemplate.java:234) at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:43) at com.be.android.locateconsultants.resources.AsyncTaskRESTServiceCaller.doInBackground(AsyncTaskRESTServiceCaller.java:1) at android.os.AsyncTask$2.call(AsyncTask.java:252) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) ... 4 more Caused by: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of MyObject out of START_ARRAY token at [Source: org.apache.http.conn.EofSensorInputStream@4076e940; line: 1, column: 1] at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:198) at org.codehaus.jackson.map.deser.BeanDeserializer.deserializeUsingCreator(BeanDeserializer.java:565) at org.codehaus.jackson.map.deser.BeanDeserializer.deserialize(BeanDeserializer.java:365) at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2395) at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1655) at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.readInternal(MappingJacksonHttpMessageConverter.java:135) at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:154) at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:74) at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:632) at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:618) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:459) ... 10 more
La estructura de MyObject es la misma que la de la aplicación del lado del servidor.
- Subida múltiple de archivos con OkHttp + Spring
- Primavera para Android, progreso de subida de archivos
- Android Spring Jackson Mapping: NoClassDefFoundError
- Spring MVC, Thymeleaf y REST
- Android websocket sockjs cliente para java primavera basada webserver
He intentado pedir al servidor como esto:
final String url = "....."; RestTemplate restTemplate = new RestTemplate(); ResponseEntity<Consultant> responseEntity = restTemplate.getForEntity( url, Consultant.class);
O así:
HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity<String> entity = new HttpEntity<String>(headers); ResponseEntity<MyObject> response = restTemplate .exchange("....",HttpMethod.GET, entity, MyObject.class); System.out.println("RESPONSE: " + response.getBody());
Pero sigue siendo el mismo error que el anterior. No puedo averiguar lo que estoy perdiendo en este punto, cualquier idea o sugerencias sería genial. Gracias.
- Spring RestTemplate: publicar una imagen y un objeto al mismo tiempo
- El resorte de solicitud de varias partes no enlaza datos de archivo
- HttpMessageNotReadableException: no se pudo leer JSON: campo no reconocido con Spring para Android
- Validación del lado del servidor de token de Google Access para la aplicación de Android
- ¿Cómo convertir Spring MVC a un proyecto Android usando PhoneGap?
- Jackson JsonParseException: Byte medio de UTF-8 no válido
- ClassCastException: RestTemplate devuelve Lista <LinkedHashMap> en lugar de List <MymodelClass>
- Cómo enviar una solicitud getForObject con parámetros Spring MVC
La solución en una situación similar era asignar a la Consultant[].class
Esto se aplica si intenta deserializar una matriz JSON de los objetos asignados.
Deberá asignarla a List<Consultant>
lugar de a Consultant.class
.
Esto está relacionado con Jackson y la forma en que está intentando deserializar e inicializar un contenedor de una matriz.
Aunque mi contexto de uso es un poco diferente, esto puede ayudar a algunos que llegan aquí de buscar errores de deserialización específicos de Jackson.
Tuve que hacerlo así:
List<Consultant> consultants = Arrays.asList( mapper.readValue(myJson.toString(), Consultants[].class) );