2017-08-09 3 views
1

J'ai une classe de fréquence qui prend un type de propriété qui indique au désérialiseur quelle sous-classe doit être résolue pendant l'exécution.Comment obtenir la propriété définie dans @JsonTypeInfo dans le code java pour la classe polymorphe lors de la désérialisation?

@JsonTypeInfo(use = Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type") 
@JsonSubTypes({ 
    @Type(value = FrequencyIncidence.class, name= "INCIDENCE"), 
    @Type(value = FrequencyRange.class, name="RANGE"), 
}) 
public abstract class Frequency extends Audit { 

private FrequencyType frequencyType; 

public FrequencyType getFrequencyType() { 
    return frequencyType; 
} 

public void setFrequencyType(FrequencyType frequencyType) { 
    this.frequencyType = frequencyType; 
} 

Est-il possible que je peux accéder au type de propriété dans mon code java, donc je ne dois pas définir un autre frequencyType de champ dans ma classe java? En ce moment j'ai besoin du champ frequencyType pour déterminer la sous-classe dans le code java et remplir les données dans la base de données dans la classe de service java. Le json pour ma fréquence ressemble à ceci.

{ "fréquence": { "type": "INCIDENCE" "frequencyType": "INCIDENCE"}} Type

est utilisé pour fournir des informations de métadonnées pour json désérialiseur et frequencyType est utilisé pour déterminer quelles informations de sous-classe nous envoyons. Peut-on le condenser en une seule propriété au lieu de deux?

Répondre

0

Oui, cela peut être fait. Vous avez besoin de deux choses:

1 - Vous devez d'abord changer la propriété visible en @JsonTypeInfo. Cela permettra de conserver la valeur "type" pour la désérialisation. 2 - Et après avoir besoin que le champ dans Fréquence ait le même nom que la propriété type.

public abstract class Frequency { 

    private FrequencyType type; 

    public FrequencyType getType() { 
     return type; 
    } 

    public void setType(FrequencyType type) { 
     this.type = type; 
    } 

Et c'est, après que vous pouvez envoyer {"type":"INCIDENCE"} et l'objet Java aurez type = INCIDENCE.

0

Vous pouvez configurer Jackson pour qu'il ne supprime pas le champ type lors de la désérialisation. Pour ce faire, définissez le paramètre visible. Étant donné que les documents dans le lien disent:

définit si la valeur d'identificateur de type sera transmis en tant que partie du flux JSON à désérialiseur (true) ou manipulé et éliminé par TypeDeserializer (false)

et

valeur par défaut est faux, ce qui signifie que gère Jackson et supprime l'identificateur de type de contenu JSON

Configurer @JsonTypeInfo comme ceci:

@JsonTypeInfo(use = Id.NAME, 
    include = JsonTypeInfo.As.PROPERTY, 
    property = "type", 
    visible = true) 

et assurez-vous qu'il est un compositeur nommé setType dans votre classe que Jackson invoquera lors de la désérialisation avec le champ de type JSON.