2016-12-22 2 views
2

내가 봄 REST JSON 직렬화/역 직렬화

내가 복합 모델 객체를 @RestController와 함께 봄/봄 부팅 및 스프링 MVC를 사용

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).

지금 내 Rest 컨트롤러에서 Spring 애플리케이션 백엔드 로직이 적절한 클래스로이 JSON을 올바르게 비 직렬화 할 수 없다.

스프링이이 구조를 deserialize 할 수 있도록하기 위해이 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 속성을 추가합니다. 이 속성의 값을 단순화하기 위해 use 매개 변수의 다른 옵션을 @JsonTypeInfo (예 : JsonTypeInfo.Id.NAME)으로 간주하십시오.