当前位置: 首页 > 面试题库 >

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

袁俊弼
2023-03-14
问题内容

我试图使用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。

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

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

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


问题答案:

无法通过或将a直接添加DeserializationProblemHandler到。调用构建器是不行的,因为结果对于该方法而言是本地的:Spring本身将稍后调用,从而创建另一个实例。ObjectMapper``Jackson2ObjectMapperBuilder``Jackson2ObjectMapperBuilderCustomizer``build()``ObjectMapper``build()``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);
    }
}


 类似资料:
  • 我有一个appender文件,并希望将org.springframwork和ch.qos.logback定向到这个日志文件。但是,当我在linux服务器上运行我的应用程序时,这两个包的INFO消息并没有进入日志文件,而是直接打印出来。以下是我的logback.xml: 08:23:22,446-ch.qos.logback.classic.joran.joranConfigurator@1b83c

  • 我使用的是log4j1。2.17和apache-extras-log4j--1.2。17.jar用于日志记录。 我的目的是根据大小对文件进行滚动和归档。下面是log4j。xml ${LOG_FILESIZE_LIMIT}是100MB。 但它没有将MaxFileSize设置为100MB,并给出以下消息。 log4j:警告无法将属性[maxFileSize]设置为值“100MB” 它采用默认的maxf

  • 以下是错误消息 java.lang.IllegalStateException:无法加载ApplicationContext 一个使用elasticSearch、mysql、redis等的Spingboot项目,谷歌有很多,但他只是一个新的Spingboot。网上的东西不管用。我不知道怎么改。 application-local.yml 应与ES的配置相关 控制器

  • 我在我的项目中使用jsPlumb库,我有一个函数,如果endpoint图像连接,则会更改它们。当页面加载并且一切正常时,我调用它,但是当我在连接事件中调用它时,什么都不会发生。这是我的代码: 如果断开连接,我还尝试将endpoint图像更改回第一个外观,但在这种情况下,只有源endpoint更改,目标保持不变: 我错过了什么,或者我如何解决这个问题? 编辑:这里是JSFIDLE: https://

  • 问题内容: 首先,我需要将ng- form设置为无效,因为它是向导的后续部分。表单包含带有元素的网格。每个元素都有其自己的验证,但是问题是,当没有元素时,表单将显示为有效。当行数为0时,我需要将其标记为对于开始情况无效。怎么做? 问题答案: 经过研究后,以下代码对我来说很好用。在控制器中: 超时确保我们可以访问该表单。它们不是在第一次通过控制器上构建的,因此需要超时或监视。然后,我们将表单标记为无

  • 问题内容: 我试图从我的xml中将按钮的文本设置为“ <<<”,但出现“错误:(20)解析XML时出错:格式不正确(无效令牌)” 因此,我跳到我的strings.xml并在其中输入它,这显然行不通。 有没有解决方法? 问题答案: 这些是html实体,也可以在android studio中使用: