J'ai une classe abstraite que j'ai besoin de sérialiser comme une liste d'éléments et de l'envoyer sur le réseau au format json.jackson impossible de sérialiser une liste d'objets polymorphes
@JsonTypeInfo(
use=JsonTypeInfo.Id.NAME,
include= As.PROPERTY,
property="searchMatchType",
defaultImpl = NoClass.class,
visible = true)
@JsonSubTypes({
@Type(value = Match.class, name = "MATCH"),
@Type(value = SynonymMatchA.class, name = "SYNONYM_MATCH_A"),
@Type(value = SynonymMatchB.class, name = "SYNONYM_MATCH_B")
})
public abstract class SearchResult {
private TypeA typeA;
private SearchMatchType searchMatchType;
@JsonCreator
public SearchResult(
@JsonProperty("searchMatchType") SearchMatchType searchMatchType,
@JsonProperty("typeA") TypeA typeA) {
this.searchMatchType = searchMatchType;
this.typeA = typeA;
}
}
Je sais que nous ne pouvons pas sérialiser une liste d'objets en java, car java complier applique l'effacement de type au moment de la compilation. J'ai donc créé une classe wrapper comme ci-dessous et renvoyer cela à partir du contrôleur principal au lieu de la liste.
public class SearchResultList {
private final List<SearchResult> searchResults;
@JsonCreator
public SearchResultList(
@JsonProperty("searchResults") List<SearchResult> searchResults) {
this.searchResults = searchResults;
}
}
Je peuplant la liste des objets de ATYPE, SYNONYM_MATCH_A et SYNONYM_MATCH_B qui sont des sous-types de classe SearchResult. Maintenant, dans json, je peux voir les champs de classe de base, mais je ne peux pas voir les champs de classe dérivés des classes MATCH, SYNONYM_MATCH_A et SYNONYM_MATCH_B. Je suis capable de voir ces objets complets quand j'inspecte la liste sur le serveur mais pas dans le json qui est sérialisé de la liste.