web-dev-qa-db-fra.com

Mappez un tableau d'objets JSON à la liste @RequestBody <T> à l'aide de jackson

J'éprouve des difficultés à utiliser Jackson pour mapper un tableau de hachages JSON posté sur Javascript (Tag).


Voici les données reçues par le contrôleur @RequestBody (il est envoyé avec l'en-tête de requête json approprié):

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


Voici le contrôleur:

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

Lorsque je débogue et affiche la valeur "entités", elle apparaît sous la forme d'une ArrayList d'objets génériques, et non d'une liste d'objets de type "Tag", comme je le pensais.

Comment faire en sorte que Jackson mappe un tableau d'objets passé sur une liste d'objects de type 'Tag'?

Merci

15
Thomas Buckley

Il semblerait que Spring ne transmette pas les informations de type complètes pour une raison quelconque, mais plutôt une version effacée, comme si la déclaration ressemblait à List<?> tag. Je ne sais pas ce qui peut être fait pour résoudre complètement ce problème (peut nécessiter quelque chose de la part de l'équipe d'intégration de Spring), mais une solution consiste à définir votre propre type, comme suit:

static class TagList extends ArrayList<Tag> { }

et l'utiliser à la place. Cela conservera la paramétrisation générique via des déclarations de type super, de sorte que même si Spring ne transmette que l'équivalent de TagList.class, Jackson peut déterminer le paramètre Tag.

39
StaxMan

Pour ce faire, vous pouvez également obtenir un tableau plutôt qu'une liste, comme suit:

@RequestBody Tag[] entities
17
user636549

Jackson requiert un constructeur par défaut sans paramètre sur les objets personnalisés. Vous devez donc simplement ajouter un constructeur par défaut à votre classe Tag.

Dans votre cas, ajoutez simplement à votre classe Tag:

public Tag(){}
0
user2812481