【问题标题】:Spring bean overriding does not throw exception when default settings is not allowing当默认设置不允许时,Spring bean 覆盖不会抛出异常
【发布时间】:2022-01-23 17:19:22
【问题描述】:

我有以下配置类。

@Configuration
public class BeanConfig {

    @Bean
    public ObjectMapper objectMapper() {
        return new ObjectMapper();
    }
}

我正在创建对象映射器 (Jackson) bean 以用作模型映射器,但我相信 Spring 必须抛出 BeanDefinitionOverrideException,因为我正在覆盖 ObjectMapper。我知道这个异常是在 Spring Boot 2.1 之后添加和抛出的,并且我使用的是 2.4.x 版本。

spring.main.allow-bean-definition-overriding=false // default config

我想知道为什么我没有收到这样的异常?

【问题讨论】:

    标签: java spring spring-boot jackson


    【解决方案1】:

    由于 spring-boot 提供的默认ObjectMapper bean 配置中的@ConditionalOnMissingBean ,如果你不自己定义一个默认的ObjectMapper bean,它只会定义和配置一个。

    现在,当您定义 ObjectMapper 时,它会导致 spring-boot 停止定义默认值。所以最后你只有一个ObjectMapper bean,因此BeanDefinitionOverrideException 不会发生。

    如果您创建另一个@Configuration 并再定义一个具有相同名称的ObjectMapper,您应该生成BeanDefinitionOverrideException

    @Configuration
    @Import(BeanConfig2.class)
    public class BeanConfig {
    
        @Bean
        public ObjectMapper objectMapper() {
            return new ObjectMapper();
        }
    }
    
    @Configuration
    public class BeanConfig2 {
    
        @Bean
        public ObjectMapper objectMapper() {
            return new ObjectMapper();
        }
    }
    

    【讨论】:

    • 没错。可见org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration
    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 2013-02-03
    • 2012-08-10
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多