自定义ObjectMapper导致配置文件配置Jackson失效。SpringBoot提供的ObjectMapper失效

自定义ObjectMapper导致配置文件配置Jackson失效。SpringBoot提供的ObjectMapper失效

背景

在我的项目中,需要使用多个ObjectMapper,SpringBoot默认的ObjectMapper用于后端返回json格式的序列化,这部分的配置可以在配置文件中配置。同时需要另外提供定制化ObjectMapper用于序列化反序列化第三方接口对接。

问题

当我使用@Configuration+@Bean自定义ObjectMapper后,我发现配置文件所有对jackson的配置均失效,一通排查后发现是SpringBoot在创建原生ObjectMapper时,有个@ConditionOnMissingBean注解

		@Bean
		@Primary
		//该注解的作用就是,当项目中不存在其他ObjectMapper时才会走这步,而我们自定义之后,自然而然不会走这不,也就是配置文件失效的原因
		@ConditionalOnMissingBean
		ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {
			return builder.createXmlMapper(false).build();
		}

该注解的作用就是,当项目中不存在其他ObjectMapper时才会走这步,而我们自定义之后,自然而然不会走这不,也就是配置文件失效的原因

问题修复

网络上一堆一模一样的答案,均无效,只要你使用@Bean注解自定义,必定无效,因为SpringBoot在初始化过程中,先加载BeanDefinition,而不是直接初始化,所以无论添加@Order,@ConditionOnBean注解,均无效。
排查过后,发现有两种解决方案

  1. 在SpringBoot启动成功后,也就是主函数执行结束后,手动添加,此时springboot初始化流程已经走完,此时添加将不会检查
		ApplicationContext run = SpringApplication.run(OriginalCircleStarter.class, args);
        BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry) run;
        beanDefinitionRegistry.registerBeanDefinition("customObjectMapper", new RootBeanDefinition(ObjectMapper.class));
  1. 复制一份ObjectMapper(推荐)
    SpringBoot为我们封装了创建ObjectMapper的builder,其中有我们配置文件中的配置项,我们直接builder后相当于复制了一份。而后就不冲突

    /**
     * 此处的ObjectMapper是springboot默认提供的ObjectMapper的复制品
     * 原因:当项目中一旦自定义objectMapper时,springboot提供的将会失效,因为原生上有@ConditionOnMissingBean注解,导致自定义后,
     * 原生的将不会被初始化,此时配置文件配置的一切将会失效,因此,我们解决办法为,复制一份
     * @param jackson2ObjectMapperBuilderCustomizer 可理解为配置文件中属性配置
     * @param jackson2ObjectMapperBuilder  objectMapper构建器
     * @return
     */
    @Bean
    @Primary
    public ObjectMapper objectMapper(Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer,
                                     Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder){
        //将springboot配置文件中的配置构建进builder中
        jackson2ObjectMapperBuilderCustomizer.customize(jackson2ObjectMapperBuilder);
        return jackson2ObjectMapperBuilder.build();
    }

    @Bean
    public ObjectMapper responseParse() {
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return objectMapper;
    }

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配置 JacksonObjectMapper,你可以按照以下步骤进行操作: 1. 首先,确保你已经添加了 Jackson 的依赖到你的项目中。在 Maven 项目中,可以在 pom.xml 文件中添加以下依赖: ```xml <dependencies> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.4</version> </dependency> </dependencies> ``` 2. 创建一个 ObjectMapper 对象,并设置你所需的配置选项。例如,如果你想要忽略未知的属性,你可以通过调用 `configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)` 方法来配置 ObjectMapper。 ```java import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); ``` 3. 如果需要,你还可以注册自定义的序列化器和反序列化器。例如,如果你想要定制某种类型的序列化/反序列化行为,可以通过调用 `registerModule()` 方法来注册一个自定义的模块。 ```java import com.fasterxml.jackson.databind.module.SimpleModule; SimpleModule module = new SimpleModule(); module.addSerializer(MyCustomType.class, new MyCustomSerializer()); module.addDeserializer(MyCustomType.class, new MyCustomDeserializer()); objectMapper.registerModule(module); ``` 以上是基本的配置过程,根据你的需求和具体情况,你可以根据 Jackson 的文档进一步了解并配置 ObjectMapper

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值