>Java >java지도 시간 >사용자 정의 디시리얼라이저 내에서 기본 Jackson 디시리얼라이저에 액세스하는 방법은 무엇입니까?

사용자 정의 디시리얼라이저 내에서 기본 Jackson 디시리얼라이저에 액세스하는 방법은 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-01 17:43:10702검색

How to Access the Default Jackson Deserializer within a Custom Deserializer?

Jackson Custom Deserializer에서 기본 Deserializer 액세스

Jackson에서 deserialization을 사용자 정의할 때 기본 deserialization 동작을 활용해야 하는 시나리오가 있을 수 있습니다. 사용자 정의 논리를 적용하기 전에. 이 요구 사항을 해결하기 위해 사용자 지정 deserializer 내에서 기본 deserializer에 액세스하는 방법에 대한 포괄적인 가이드가 있습니다.

다음 시나리오를 고려하세요.

public class UserEventDeserializer extends StdDeserializer<User> {

    public UserEventDeserializer() {
        super(User.class);
    }

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt)
        throws IOException, JsonProcessingException {

        User deserializedUser = null;
        try {
            deserializedUser = super.deserialize(jp, ctxt, new User());
        } catch (UnsupportedOperationException e) {
            // Access default Jackson deserializer here
        }
        // Perform custom logic on deserializedUser...

        return deserializedUser;
    }
}

해결책: BeanDeserializerModifier

기본 역직렬 변환기에 액세스하는 데 권장되는 접근 방식은 BeanDeserializerModifier. 이를 통해 특정 Bean 클래스(이 경우 User)에 대한 기본 동작을 수정할 수 있습니다.

public class UserDeserializerModifier extends BeanDeserializerModifier {

    @Override
    public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
        if (beanDesc.getBeanClass() == User.class) {
            return new JsonDeserializer<>(); // Default deserializer
        }
        return super.modifyDeserializer(config, beanDesc, deserializer);
    }
}

사용 예

사용자 정의 수정자를 사용하려면 등록하세요. SimpleModule을 사용하여 이를 구성합니다. ObjectMapper:

SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new UserDeserializerModifier());

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(module);

참고: 이 접근 방식을 사용할 때 JsonMappingException을 방지하려면 ResolvableDeserializer를 구현해야 할 수도 있습니다.

대체 접근 방식

BeanDeserializerModifier는 안정적이고 유연하지만 해결 방법은 다음과 같습니다.

  • AnnotationIntrospector 재정의: 여기에는 AnnotationIntrospector를 확장하고 @Transactional과 같은 주석에 대한 동작을 수정하는 작업이 포함됩니다. 그러나 더 복잡할 수 있으며 항상 예상대로 작동하지 않을 수도 있습니다.
  • JsonDeserializerBuilder 사용: 이 접근 방식은 Spring에서 애플리케이션 컨텍스트에 액세스해야 하며 다음보다 덜 간단할 수 있습니다. BeanDeserializerModifier.

결론

BeanDeserializerModifier를 활용하면 사용자 정의 역직렬 변환기 내에서 기본 Jackson 역직렬 변환기에 효과적으로 액세스하고 활용할 수 있으므로 유연하고 효율적인 역직렬화 동작이 가능합니다. .

위 내용은 사용자 정의 디시리얼라이저 내에서 기본 Jackson 디시리얼라이저에 액세스하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.