복붙노트

[SPRING] 봄 부팅에서 ProblemHandler를 ObjectMapper로 설정할 수 없음

SPRING

봄 부팅에서 ProblemHandler를 ObjectMapper로 설정할 수 없음

Jackson2ObjectMapperBuilderCustomizer를 사용하여 객체 매퍼에 사용자 정의 문제 처리기를 추가하려고했습니다.

@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
    return new Jackson2ObjectMapperBuilderCustomizer() {
        @Override
        public void customize(Jackson2ObjectMapperBuilder builder) {
            ObjectMapper m = builder.build();
            m.addHandler(
                    new DeserializationProblemHandler() {
                        @Override
                        public boolean handleUnknownProperty(DeserializationContext ctxt, JsonParser p, JsonDeserializer<?> deserializer, Object beanOrClass, String propertyName) throws IOException {
                            System.out.println("ahahahaa");
                            return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
                        }
                    }
            );
        }
    };
}

하지만 내가 autowired ObjectMapper 빈 _problemHandlers 속성이 null입니다.

나는 또한 존재하는 ObjectMapper를 다음과 같이 사용자 화하려고 시도했다.

@Autowired
public customize(ObjectMapper mapper) {
...
}

그러나 결과는 같습니다. 누가이 자산을 지울 수 있는지 모르겠습니다. 나는 다른 장소에서 객체 매퍼의 다른 빌더 / 공장 / 등을 전혀 초기화하지 않는다. 내가 뭘 잘못하고있어?

해결법

  1. ==============================

    1.Jackson2ObjectMapperBuilder 또는 Jackson2ObjectMapperBuilderCustomizer를 통해 DeserializationProblemHandler를 ObjectMapper에 직접 추가하는 것은 불가능합니다. 생성 된 ObjectMapper는 메소드에 대해 로컬이므로, 빌더에서 build ()를 호출하는 것은 중단됩니다. Spring 자체는 나중에 build ()를 호출하여 다른 ObjectMapper 인스턴스를 작성합니다.

    Jackson2ObjectMapperBuilder 또는 Jackson2ObjectMapperBuilderCustomizer를 통해 DeserializationProblemHandler를 ObjectMapper에 직접 추가하는 것은 불가능합니다. 생성 된 ObjectMapper는 메소드에 대해 로컬이므로, 빌더에서 build ()를 호출하는 것은 중단됩니다. Spring 자체는 나중에 build ()를 호출하여 다른 ObjectMapper 인스턴스를 작성합니다.

    그러나 Jackson 모듈을 등록하면 이렇게 할 수 있습니다.

    이렇게하면 작동합니다.

    @Bean
    public Jackson2ObjectMapperBuilderCustomizer customizer() {
        return new Jackson2ObjectMapperBuilderCustomizer() {
            @Override
            public void customize(Jackson2ObjectMapperBuilder builder) {
                builder.modules(new MyModule());
            }
        };
    }
    
    private static class MyModule extends SimpleModule {
        @Override
        public void setupModule(SetupContext context) {
            // Required, as documented in the Javadoc of SimpleModule
            super.setupModule(context);
            context.addDeserializationProblemHandler(new MyDeserializationProblemHandler());
        } 
    }
    
    private static class MyDeserializationProblemHandler extends DeserializationProblemHandler {
        @Override
        public boolean handleUnknownProperty(DeserializationContext ctxt,
                                             JsonParser p,
                                             JsonDeserializer<?> deserializer,
                                             Object beanOrClass,
                                             String propertyName)
                throws IOException {
            System.out.println("ahahahaa");
            return super.handleUnknownProperty(ctxt, p, deserializer, beanOrClass, propertyName);
        }
    }
    
  2. from https://stackoverflow.com/questions/46644099/cant-set-problemhandler-to-objectmapper-in-spring-boot by cc-by-sa and MIT license