가지고 다음과 같은 클래스가 포함되어 있지 않습니다. 이 문제를 해결하는 방법?잭슨 유형 ID가 생성 JSON에
EDIT : 마지막으로 나는 릴리스 2.3.0 이후에 도입 된 JsonTypeInfo.As.EXISTING_PROPERTY
을 사용했습니다. 실제 유형을 결정하기 위해 기존 등록 정보를 사용합니다.
가지고 다음과 같은 클래스가 포함되어 있지 않습니다. 이 문제를 해결하는 방법?잭슨 유형 ID가 생성 JSON에
EDIT : 마지막으로 나는 릴리스 2.3.0 이후에 도입 된 JsonTypeInfo.As.EXISTING_PROPERTY
을 사용했습니다. 실제 유형을 결정하기 위해 기존 등록 정보를 사용합니다.
지우기 유형이 TrackedChange.tracked
인 경우 문제가 발생합니다. 런타임시 유형이 없어 지므로 유형이 손실되고 Jackson 직렬 기가 유형을 판별 할 수 없으므로이를 B
으로 인식하지 않고 @JsonTypeInfo
을 찾지 못합니다. 따라서 런타임에 Jackson은 TrackedChange.tracked
을 입력하여 Object
유형으로 읽습니다.
잭슨에서 유형 삭제를 완화하는 다양한 방법이 있지만 일반적으로 컬렉션의 제네릭 주위에 있습니다. (이
ObjectMapper mapper = new ObjectMapper();
TypeResolverBuilder<?> typer = new ObjectMapper.DefaultTypeResolverBuilder(ObjectMapper.DefaultTyping.OBJECT_AND_NON_CONCRETE);
typer = typer.init(JsonTypeInfo.Id.CLASS, null);
typer = typer.inclusion(JsonTypeInfo.As.PROPERTY);
typer = typer.typeProperty("type");
mapper.setDefaultTyping(typer);
이 직렬화하는 동안 개체와 콘크리트가 아닌 유형에 대한 유형 매퍼 구성을 등록합니다 :
기본적으로 내가 볼 수있는 그 목표를 달성하기위한 하나의 방법이, 당신은 다음과 같이 ObjectMapper 구성 할 수 있습니다 TrackedChange.tracked
사례를 다룹니다. 안타깝게도이 구성이 예제에서와 같이 일치하는 b_type
이름을 사용한다는 사전 등록 방법이 없습니다.
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type")
은 다음과 같이 당신에게 출력주기 :
{
"type" : "so.json.typeinfo.B",
"trackChange" : {
"tracked" : {
"type" : "so.json.typeinfo.B",
"trackChange" : null,
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
},
"aFoo" : "aFoo",
"bFoo" : "bFoo"
}
덕분에 내가 가진 최고의 제안은 위의 구성 동작을 일치 다음을 사용하는 클래스의 구성을 변경하는 것입니다! JsonTypeInfo.Id.CLASS를 JsonTypeInfo.Id.NAME으로 변경했고 예상대로 작동하기 시작했습니다. – tiktak