无法在Spring Boot中将ProblemHandler设置为ObjectMapper

Dam*_*eev 3 java spring jackson objectmapper jackson-databind

我试图使用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);
                        }
                    }
            );
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

但是当我自动装配ObjectMapper bean时,_problemHandlers属性为null。

我也尝试过使用以下命令自定义现有的ObjectMapper:

@Autowired
public customize(ObjectMapper mapper) {
...
}
Run Code Online (Sandbox Code Playgroud)

但是结果是一样的。我不知道谁可以删除此属性。我根本不会在另一个地方初始化对象映射器的其他构建器/工厂/等。我做错了什么?

Fra*_*eau 5

无法通过或直接将a添加DeserializationProblemHandler到。调用构建器是不可行的,因为结果对于该方法而言是局部的:Spring本身将稍后调用,从而创建另一个实例。ObjectMapperJackson2ObjectMapperBuilderJackson2ObjectMapperBuilderCustomizerbuild()ObjectMapperbuild()ObjectMapper

但是,可以通过注册Jackson模块来做到这一点:

  • 建造者有一种modules()方法
  • 该模块可通过实例访问setupModule(),该SetupContext实例具有一个addDeserializationProblemHandler()方法

然后这应该工作

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)