2012-06-02 32 views
15

Tengo problemas al usar Jackson para mapear una matriz JSON de etiquetas hash publicadas en Javascript (Tag).Asignar una matriz JSON de objetos a @RequestBody List <T> usando jackson


Estos son los datos recibidos por el @RequestBody controlador (Es envía con RequestHeader JSON correcta):

[{name=tag1}, {name=tag2}, {name=tag3}] 


Aquí es el controlador:

@RequestMapping(value = "purchases/{purchaseId}/tags", method = RequestMethod.POST, params = "manyTags") 
@ResponseStatus(HttpStatus.CREATED) 
public void createAll(@PathVariable("purchaseId") final Long purchaseId, @RequestBody final List<Tag> entities) 
{ 
     Purchase purchase = purchaseService.getById(purchaseId); 

     Set<Tag> tags = purchase.getTags(); 
     purchaseService.updatePurchase(purchase); 
    } 

Cuando depuración y ver el valor de 'entidades' que se muestra como una ArrayList de objetos genéricos, no como una lista de objetos del tipo 'Tag' como era de esperar.

¿Cómo hago para que jackson asigne una serie pasada de objetos a una lista de objetos de tipo 'Etiqueta'?

Gracias

+0

han intentado así? '[{" name "=" tag1 "}, {" name "=" tag2 "}, {" name "=" tag3 "}]' –

+0

No lo he intentado, Sean, fui con la solución de usar un matriz para @RequestBody en su lugar. Ver http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-binding –

Respuesta

39

suena como la primavera no está pasando la información de tipo completo, por alguna razón, sino más bien un tipo de versión que se ha borrado, como si la declaración era algo así como List<?> tag. No sé qué se puede hacer para resolver completamente este (puede necesitar algo de equipo de integración de primavera), pero una solución alternativa consiste en definir su propio tipo como:

static class TagList extends ArrayList<Tag> { } 

y utilizar en su lugar. Esto retendrá la parametrización genérica a través de declaraciones de super-tipo para que incluso si Spring solo pasa el equivalente de TagList.class, Jackson pueda averiguar el parámetro Tag.

+0

Cheers StaxMan .... Me encontré con el siguiente enlace que ofrece una serie de opciones, además de tu uno aquí. http://stackoverflow.com/questions/4441557/rest-with-spring-and-jackson-full-data-binding –

+0

Gracias StaxMan. Estaba enfrentando el mismo problema. Tu respuesta me ayudó. –

+0

Eso es tan simple y práctico, yo uso esto en mi aplicación de Android. Gracias – Gino

16

Otra manera de hacer esto es obtener una matriz en lugar de una lista, de la siguiente manera:

@RequestBody Tag[] entities 
+0

Ok sí Thomas quería obtener una lista de etiquetas, pero como esto no funciona, sugerí obtener una matriz.Luché con este mismo problema hace un tiempo, y en este momento los objetos en la Lista, el objeto genérico, no se crearán, tal vez esto se solucionará en el futuro, no sé, así que en lugar de obtener una Lista a través de RequestBody, uno debería obtener una matriz de ese objeto específico, sin que nada tenga que cambiar en el lado de los remitentes. – liloboy

0

Jackson requiere un constructor predeterminado sin parámetros en objetos personalizados, por lo que tendrá que añadir simplemente una constructor predeterminado para su clase Tag.

En su caso, simplemente añadir a su clase Tag:

public Tag(){} 
Cuestiones relacionadas