Bonjour,
Je suis actuellement un peu perdu. En effet, j'utilise JSON pour sérializer des classes entre un module maven de type war (sur un serveur) et un autre module côté client. J'ai trois classes dont deux qui héritent de la troisième qui n'est pas abstraite (je dois la laisser non abstraite).
Globalement, il y a deux cas d'utilisation :
- SCENARIO A : la serialization d'objets qui sont des instances d'une des deux classes enfants et là il n'y a pas de problème.
- SCENARIO B : la serialization d'objets de n'importe quel des 3 types et ils sont passés comme étant de la classe parent. Après, du côté client, je peux les récupérer via instanceof.
Ci-dessous le traitement distinct des opérations:
- Pour le premier SCENARIO, cela marche tout seul si je ne touche à rien.
- Pour le second SCENARIO, j'y suis arrivé en mettant en place un serializer sur la classe mère. Celui-ci vérifiait l'instance et mettait en place le nom de la classe au début du texte du json. Néanmoins, cela cassaiy le premier SCENARIO et on m'a demandé aussi de ne plus le garder. Il est à noter que pour mettre en place ce cas, je suis passé par l'annotation : @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property = "@class") sur la classe principale.
Au niveau du code, j'ai mis ces annotations sur la classe principale:
Là, quand je mets le defaultImpl, c'est toujours la classe mère Principale.class qui est choisie et je perds donc des champs lorsqu'il y a aussi des instances de classes enfants. C'est au niveau du SCENARIO B.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = Principale.class) @JsonSubTypes({ @Type(value = Child1.class), @Type(value = Child2.class) })
Si je ne mets pas de defaultImpl, cela me renvoie : missing property 'type' that is to contain type id (au niveau du SCENARIO B)
J'ai tenté aussi ces annotations:
Je tiens à préciser qu'ici, j'ai aussi tenté avec les noms dans les sous types. Néanmoins, cela ne marche pas non plus et je ne dois pas les spécifier au sein des classes enfants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") @JsonSubTypes({ @Type(value = Child1.class), @Type(value = Child2.class) })
J'obtiens au niveau du SCENARIO B toujours la même erreur : missing property 'type' that is to contain type id
Bref, je viens vous demander un peu d'aide.
Merci d'avance.
Partager