web-dev-qa-db-fra.com

Polymorphisme dans les annotations jackson: utilisation de @JsonTypeInfo

Je voudrais savoir si @JsonTypeInfo l'annotation peut être utilisée pour les interfaces. J'ai un ensemble de classes qui doivent être sérialisées et désérialisées.

Voici ce que j'essaie de faire. J'ai deux classes d'implémentation Sub1, Sub2 implémentation MyInt. Certaines des classes de modèle ont la référence d'interface pour les types d'implémentation. J'aimerais désérialiser les objets basés sur le polymorphisme

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT)
@JsonSubTypes({
    @Type(name="sub1", value=Sub1.class), 
    @Type(name="sub2", value=Sub2.class)})
public interface MyInt{
}

@JsonTypeName("sub1")
public Sub1 implements MyInt{
}

@JsonTypeName("sub2")
public Sub2 implements MyInt{
}

J'obtiens le JsonMappingException suivant:

Jeton inattendu (END_OBJECT), FIELD_NAME attendu: besoin d'une chaîne JSON contenant l'identifiant de type

50
Chris

@JsonSubTypes.Type Doit avoir une valeur et un nom comme celui-ci,

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=As.WRAPPER_OBJECT, property="type")
@JsonSubTypes({       
    @JsonSubTypes.Type(value=Dog.class, name="dog"),
    @JsonSubTypes.Type(value=Cat.class, name="cat")       
}) 

Dans la sous-classe, utilisez @JsonTypeName("dog") pour dire le nom.
Les valeurs dog et cat seront définies dans la propriété nommée type.

46
Senthil Kumar