2017-08-09 20 views
1

私は実行時にどのサブクラスを解決するかをデシリアライザに伝えるプロパティタイプをとる頻度クラスを持っています。デシリアライズ中にポリモーフィックなクラスのJavaコードで@JsonTypeInfoで定義されたプロパティを取得する方法は?

@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; 
} 

私のJavaコードでプロパティタイプにアクセスする方法はありますか?私はJavaクラスで別のフィールドのfrequencyTypeを定義する必要はありませんか? 今、私は、javaコードのサブクラスを決定し、javaサービスクラスのデータベースにデータを移入するためにfrequencyTypeフィールドが必要です。私の周波数のjsonはこのように見えます。

{ "周波数":{ "タイプ": "発生率について"、 "frequencyType": "発生率について"}}

タイプがJSONデシリアライザとfrequencyTypeにメタデータ情報を提供するために使用されていますどのサブクラス情報を送信するかを決定するために使用されます。 2つではなく1つのプロパティに集約できますか?

答えて

0

はい、できます。

1 - まずvisibleプロパティを@JsonTypeInfoに変更する必要があります。これは、デシリアライズのための "タイプ"の値を保持することを可能にします。

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

2 - そして、あなたが必要とした後で、Frequencyのフィールドは、typeプロパティと同じ名前を持っています。

public abstract class Frequency { 

    private FrequencyType type; 

    public FrequencyType getType() { 
     return type; 
    } 

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

そして、あなたは{"type":"INCIDENCE"}を送ることができますし、Javaオブジェクトがタイプ=発生率を持つことになります、その後それは、それです。

0

デシリアライズ時にtypeフィールドを削除しないようにJacksonを設定できます。これを達成するには、visibleパラメーターを設定します。リンク内のドキュメントが言うように:

タイプ識別子の値が(偽)

をデシリアライザ(真)にJSONストリームの一部として渡された、またはTypeDeserializerによって処理して除去するかどうかを定義します

デフォルト値は、ジャクソンが処理し、JSONコンテンツから型識別子を削除することを意味し、falseで

を設定し、このような@JsonTypeInfo

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

とジャクソンはタイプJSONフィールドと直列化復元時に呼び出すクラスでsetTypeという名前のセッターがあることを確認してください。

関連する問題