항목 목록으로 직렬화하고 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이 아닌 완전한 개체를 볼 수 있습니다.