无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper [英] Can't set ProblemHandler to ObjectMapper in Spring Boot

查看:33
本文介绍了无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试使用 Jackson2ObjectMapperBuilderCustomizer 将自定义问题处理程序添加到对象映射器:

I tried to add custom problem handler to object mapper with 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);
                        }
                    }
            );
        }
    };
}

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

But when i autowired ObjectMapper bean _problemHandlers property is null.

我还尝试使用以下方法自定义现有的 ObjectMapper:

I also tried just customize existed ObjectMapper with:

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

但结果是一样的.我不知道谁能抹掉这个财产.我根本没有在另一个地方初始化对象映射器的另一个构建器/工厂/等.我做错了什么?

But result is the same. I don't know who can erasure this property. I don't initialize another builders/factories/etc of object mapper in another place at all. What i'm doing wrong?

推荐答案

不可能通过 Jackson2ObjectMapperBuilder 直接将 DeserializationProblemHandler 添加到 ObjectMappercode> 或 Jackson2ObjectMapperBuilderCustomizer.在构建器上调用 build() 是行不通的,因为结果 ObjectMapper 是方法本地的:Spring 本身将调用 build() 稍后,创建另一个 ObjectMapper 实例.

It's not possible to directly add a DeserializationProblemHandler to the ObjectMapper via a Jackson2ObjectMapperBuilder or Jackson2ObjectMapperBuilderCustomizer. Calling build() on the builder is a no-go, since the resulting ObjectMapper is local to the method: Spring itself will call build() later, creating another ObjectMapper instance.

但是,可以通过注册 Jackson 模块来实现:

However, it's possible to do so by registering a Jackson module :

  • 构建器有一个 modules() 方法
  • 模块可以通过 setupModule() 访问 SetupContext 实例,该实例具有 addDeserializationProblemHandler() 方法
  • the builder has a modules() method
  • the module has access via setupModule() to a SetupContext instance, which has a addDeserializationProblemHandler() method

这应该可以工作

@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);
    }
}

这篇关于无法在 Spring Boot 中将 ProblemHandler 设置为 ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆