2017-09-07 3 views
0

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.

Répondre

0

Je n'utilisais pas les getters pour les champs de ma classe dérivée, donc jackson n'était pas capable d'obtenir la valeur des champs lors de la sérialisation de l'objet au format json. Une fois que j'ai mis les getters, il a pu sérialiser correctement.