2017-04-25 15 views
2

역 직렬화 중에 예외보다 아래에 있습니다. 손님 프로필은 루트 객체 내의 중첩 된 객체입니다 (몇 레벨 이내). 나는 카프카 (kafka) 주제에서이 메시지의 소비자 일 뿐이 기 때문에 어떻게 직렬화되는지에 대한 제어권을 갖고 있지 않습니다. 이 일을 할 수있는 방법은 나를 위해 작동 및 기타 속성이 채워지와 GuestProfile에 null을 반환예기치 않은 토큰 (END_OBJECT), 예상 FIELD_NAME : '@ 유형'누락 된 속성

mapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE,false); 

를 설정하는 것보다 다른 존재입니다. 그러나 JSON에서이 특정 중첩 객체에 대한 비 직렬화를 사용자 정의하고 채울 수있는 방법이 필요합니다.

com.fasterxml.jackson.databind.JsonMappingException : 예기치 않은 토큰 (END_OBJECT), 예상 FIELD_NAME : 이다없는 재산 '@type이'(클래스 com.test.GuestProfile에 대한) 유형 ID를 포함

답변

1

Jackson JSON 라이브러리는 인터페이스 또는 다형성 유형이 사용될 때이 예외를 발생시킵니다. GuestProfile은 인터페이스, 추상 클래스 또는 다형 유형이어야합니다. 그렇지 않으면 실제 구현이며 부모가 있습니다.

이 다형성 유형은 JSON에서 유형 힌트를 사용하도록 구성 될 수 있습니다.

@JsonTypeInfo 같은 뭔가를 봐 (사용 = JsonTypeInfo.Id.NAME 포함 = JsonTypeInfo.As.PROPERTY) Java의 형태에

.

당신은 그냥 "유형"에, 예를 들어, 기본 @type 이름을 변경할 수 있습니다

@JsonTypeInfo (사용 = JsonTypeInfo.Id.NAME을 = JsonTypeInfo.As.PROPERTY, 재산 = "유형"포함)

개체의 직렬화 된 JSON 값에 '@type'이라는 추가 특성이 필요합니다. JSON 세대를 바꿀 수 없기 때문에 이것은 해결책이 아닙니다. 단 하나의 구현이 있다면

, 당신은 사용할 수 있습니다 (= GuestProfile.class 등)

@JsonDeserialize

그것은 잭슨의 오히려 새로운 기능입니다을 항상하지 않은 거기에 있었다.

그렇지 않으면 비 직렬화 프로세스를 사용자 정의 할 수 있습니다. 자체 디시리얼라이저를 구성한 다음 들어오는 값을 조사하고 deserialize 할 대상 객체 유형에 따라 내용을 결정할 수 있습니다.

https://github.com/FasterXML/jackson-docs/wiki/JacksonPolymorphicDeserialization