2010-06-25 8 views
8

J'utilise actuellement Jackson 1.4.2 et tente de désérialiser les valeurs code (identifiants uniques pour les informations de type) qui sont transmises de notre interface utilisateur aux contrôleurs Java (servlets).Jackson ne reconnaît pas l'annotation @JsonCreator

Il existe plusieurs types (par exemple ABCType, XYZType, etc.) que tous les étendent à partir d'une AbstractType, mais chaque type de béton présente une méthode de fabrication statique qui prend en tant que paramètre unique, un identifiant unique, et renvoie l'objet de type (nom, types associés, description, acronymes valides, etc.) représentés par cet identifiant. La méthode statique dans chaque type de béton (par exemple XYZType) est annotées avec @JsonCreator:

@JsonCreator 
public static XYZType getInstance(String code) { 
    ..... 
} 

Le problème que je vois bien est une exception lancée par le mappeur de Jackson essaie de désérialiser le JSON à ces types:

causée par: org.codehaus.jackson.map.JsonMappingException: Aucun constructeur par défaut trouvé pour le type [type simple, classe com.company.type.XYZtype]: instanciation de l'objet JSON.

Qu'est-ce que je manque ici de l'annotation @JsonCreator aux méthodes statiques d'usine (ou est-il à voir avec Jackson aux prises avec les 1.4.2 types de béton s'étendant à partir d'un AbstractType?)?

Répondre

12

Le @JsonCreator d'annotation nécessite l'@JsonProperty d'annotation. Cette Jackson wiki page donne peu d'informations mais offre un exemple de code:

@JsonCreator 
public Name(@JsonProperty("givenName") String g, @JsonProperty("familyName") String f) 
{ 
    givenName = g; 
    familyName = f; 
} 

Vous trouverez une explication plus détaillée à this blog post.

Votre exemple de code devrait donc ressembler à ceci:

@JsonCreator 
public static XYZType getInstance(@JsonProperty("someCode") String code) 
{ 
... 
} 
4

Le problème est que Jackson ne voit que le type de base déclarée, et ne sait pas où chercher les sous-types. Étant donné que le traitement de type polymorphique complet a été ajouté en 1.5, ce que vous devez faire avec 1.4 est d'ajouter une méthode usine dans la classe de base et de répartir les méthodes à partir de là.