【问题标题】:Spring Boot 2.3.1 Duplicate Bean DefinitionsSpring Boot 2.3.1 重复的 Bean 定义
【发布时间】:2020-07-06 06:34:15
【问题描述】:

我正在从 Spring Boot 1.5.x 升级到 2.3.1。

遇到以下在 Spring boot 较早时修复的 Bug。 https://jira.spring.io/browse/DATAJPA-1448

尝试了以下属性解决方法,这也无济于事。

spring.main.allow-bean-definition-overriding=true

任何人都面临同样的问题或任何解决方法?

以下错误

org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.context.config.internalBeanConfigurerAspect' defined in org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=null; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration; factoryMethodName=beanConfigurerAspect; initMethodName=null; destroyMethodName=(inferred); defined in org.springframework.context.annotation.aspectj.SpringConfiguredConfiguration] for bean 'org.springframework.context.config.internalBeanConfigurerAspect': There is already [Root bean: class [org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect]; scope=; abstract=false; lazyInit=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=aspectOf; initMethodName=null; destroyMethodName=null] bound.
at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition(DefaultListableBeanFactory.java:941) ~[spring-beans-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod(ConfigurationClassBeanDefinitionReader.java:286) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:144) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:120) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:331) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:236) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:280) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:96) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:707) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:533) ~[spring-context-5.2.7.RELEASE.jar:5.2.7.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:143) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:758) ~[spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:750) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1237) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.3.1.RELEASE.jar:2.3.1.RELEASE]
at XXXXXXXXXXXXXXXXXXXXX.main(XXXXXXXXXXXXXXXXXX.java:38) [classes/:

**

更新

**

以编程方式设置 AllowBeanDefinitionOverriding 有助于解决这部分问题(之前试图通过属性文件注入), 但是保持这个线程打开,因为原始根本原因在 spring-jpa 中,spring-beans 还不明显。

   SpringApplication sa = new SpringApplication(xxxxxxx.class);
   sa.setAllowBeanDefinitionOverriding(true);

【问题讨论】:

    标签: spring spring-boot spring-data-jpa spring-data


    【解决方案1】:

    我们面临与 OP 类似的问题 - 一旦从 spring boot 2.2.8 升级到 2.3.1,围绕自动配置的 junit 测试开始失败并出现 BeanDefinitionOverrideException 错误,并且 OP 提到的解决方案不起作用。通过属性文件或环境后处理器设置属性 spring.main.allow-bean-definition-overriding=true 效果不佳。

    修复:

    我们使用 ApplicationContextRunner 来测试在上下文中加载多个 bean。从 ApplicationContextRunner 的实例调用 withAllowBeanDefinitionOverriding(true) 方法修复了它。

    根据 Spring Boot 2.3.0 发行说明here

    "为了与 SpringApplication 保持一致,现在 ApplicationContextRunner 默认情况下禁用 bean 覆盖。如果你需要使用 bean 覆盖测试,可以使用 withAllowBeanDefinitionOverriding 启用它。”

    【讨论】:

      猜你喜欢
      • 2016-09-10
      • 1970-01-01
      • 2019-08-10
      • 2017-04-24
      • 2017-09-12
      • 2020-08-15
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多