2017-09-07 5 views
0

항목 목록으로 직렬화하고 json 형식으로 네트워크를 통해 전송해야하는 추상 클래스가 있습니다.jackson은 다형성 객체 목록을 직렬화 할 수 없습니다.

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

나는 자바 컴파일러는 컴파일시 타입의 삭제를 적용하기 때문에 우리가 자바 객체의 목록을 직렬화 할 수없는 것을 알고있다. 그래서 아래 래퍼 클래스를 생성하고이를 목록 대신 주 컨트롤러에서 반환했습니다.

public class SearchResultList { 

    private final List<SearchResult> searchResults; 

    @JsonCreator 
    public SearchResultList(
      @JsonProperty("searchResults") List<SearchResult> searchResults) { 
     this.searchResults = searchResults; 
    } 
} 

나는의 SearchResult 클래스의 서브 타입이다 타입 MATCH, SYNONYM_MATCH_A 및 SYNONYM_MATCH_B의 개체 목록을 채우는하고있다. json에서 기본 클래스 필드를 볼 수 있지만 MATCH, SYNONYM_MATCH_A 및 SYNONYM_MATCH_B 클래스의 파생 클래스 필드를 볼 수 없습니다. 서버에서 목록을 검사 할 때 목록에서 직렬화 된 json이 아닌 완전한 개체를 볼 수 있습니다.

답변

0

필자는 파생 클래스의 필드에 getter를 사용하지 않으므로 jackson은 객체에서 json 형식으로 직렬화하는 동안 필드 값을 가져올 수 없었습니다. 일단 getters를 넣으면 제대로 직렬화 할 수있었습니다.