2016-12-22 1 views
2

スプリングREST複合多形型のJSONシリアライズ/デシリアライズ

public abstract class BaseQuery { 

    private final Long characteristicId; 

... 

} 

public abstract class ComparableQuery extends BaseQuery { 

    private final Object value; 

    private final String comparisonOperator; 

... 

} 

public class GreaterOrEqualQuery extends ComparableQuery { 

    public GreaterOrEqualQuery(Long characteristicId, Object value) { 
     super(characteristicId, value, ">="); 
    } 

} 

public class EqualQuery extends ComparableQuery { 

    public EqualQuery(Long characteristicId, Object value) { 
     super(characteristicId, value, "="); 
    } 

} 

public class GreaterQuery extends ComparableQuery { 

    public GreaterQuery(Long characteristicId, Object value) { 
     super(characteristicId, value, ">"); 
    } 

} 

public class CompositQuery extends BaseQuery { 

    private final String operator; 
    private final BaseQuery[] queries; 

    public CompositQuery(Long characteristicId, Operator operator, BaseQuery... queries) { 
     super(characteristicId); 
     this.operator = operator.value; 
     this.queries = queries; 
    } 

... 

} 

このモデルの使用例は、次のようになります。

Set<BaseQuery> queries = new HashSet<>(); 

BaseQuery megapixelCharacteristicQuery = new CompositQuery(megapixelCharacteristic.getCharacteristicId(), CompositQuery.Operator.AND, new GreaterOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 10), new LessOrEqualQuery(megapixelCharacteristic.getCharacteristicId(), 50)); 
queries.add(megapixelCharacteristicQuery); 
queries.add(new EqualQuery(androidCharacteristic.getCharacteristicId(), true)); 

シリアライズ私は、上記のように正しく非直列化モデルを得るために私のバックエンドのREST APIエンドポイントに(適切なエントリを設定し、このまたはクライアントアプリケーション(AngularJS)から同様のJSONを渡す必要が

[ 
    { 
     "operator":"AND", 
     "queries":[ 
     { 
      "value":10, 
      "comparisonOperator":"\u003e\u003d", 
      "characteristicId":391 
     }, 
     { 
      "value":50, 
      "comparisonOperator":"\u003c\u003d", 
      "characteristicId":391 
     } 
     ], 
     "characteristicId":391 
    }, 
    { 
     "value":true, 
     "comparisonOperator":"\u003d", 
     "characteristicId":383 
    } 
] 

:ようSet<BaseQuery> queriesのためのJSONオブジェクトが見えますCompositQueryまたはEqualQueryなど)。

私のSpringアプリケーションのバックエンドロジックは、Restコントローラで、このJSONを適切なクラスで正しくデシリアライズできません。

Springがこの構造をデシリアライズするのを助けるために、このJSONにいくつかのメタ情報(または他のもの)を提供する方法はありますか?

答えて

2

次のようにスーパークラスにこの使用ジャクソンの注釈を達成することができます

import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonSubTypes; 
import com.fasterxml.jackson.annotation.JsonSubTypes.Type; 
import com.fasterxml.jackson.annotation.JsonTypeInfo; 

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "javaclass") 
@JsonSubTypes({ 
    @Type(value = GreaterOrEqualQuery.class), 
    @Type(value = EqualQuery.class) 
    //and so on... 
}) 
public abstract class BaseQuery { 
    ... 
} 

をこれはuse = JsonTypeInfo.Id.CLASSの場合には完全修飾名であるJSON表現にjavaclassプロパティを追加します。このプロパティの値を簡素化するために、@JsonTypeInfoのパラメータ(例えば、JsonTypeInfo.Id.NAME)の異なるオプションを検討してください。

関連する問題