web-dev-qa-db-fra.com

Impossible de construire une instance de - Jackson

J'utilise Jackson et j'ai des problèmes. Lorsque j'essaie de désérialiser un objet, l'erreur suivante apparaît:

com.fasterxml.jackson.databind.JsonMappingException: 
    Can not construct instance of net.MyAbstractClass, 
    problem: abstract types either need to be mapped to concrete types, 
        have custom deserializer, or be instantiated with additional type information

J'ai des problèmes dans l'attribut:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "@id")
@JsonSubTypes({ @JsonSubTypes.Type(value = MyAbstractClass.class, name = "MyAbstractClass") })
@ManyToOne
private MyAbstractClass object;

Quelqu'un pourrait-il m'aider?

41
Danilo M.

Vous ne pouvez pas instancier une classe abstraite, Jackson non plus. Vous devez indiquer à Jackson comment instancier MyAbstractClass avec un type concret.

Voir cette réponse sur stackoverflow: bibliothèque Jackson JSON: comment instancier une classe contenant des champs abstraits

Et peut-être aussi voir désérialisation polymorphe de Jackson

37
jlabedo

Votre @JsonSubTypes déclaration n'a pas de sens: il faut lister les (sous-) classes d'implémentation, PAS la classe elle-même (ce qui serait inutile). Vous devez donc modifier cette entrée pour répertorier les sous-classes existantes; ou utilisez un autre mécanisme pour enregistrer des sous-classes (SimpleModule a quelque chose comme addAbstractTypeMapping).

6
StaxMan