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.

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.

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) ); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.