Question

Je suis actuellement en utilisant Jackson et tenter désérialisation 1.4.2 des valeurs code (identificateurs uniques pour les informations de type) qui sont passés de notre retour de l'interface utilisateur aux contrôleurs Java (servlets).

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

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

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

  

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

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

Était-ce utile?

La solution

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

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

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

Votre exemple de code devrait donc ressembler à ceci:

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

Autres conseils

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. Depuis toute manipulation de type polymorphes a été ajouté à 1,5, ce que vous devez faire avec 1.4 est d'ajouter la méthode d'usine dans la classe de base et les méthodes expédition à partir de là.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top