无法注册以 null 定义的 bean 'metaDataSourceAdvisor'



我已经将 Spring Boot 版本从 2.0.3 更新到 2.1.1,但我得到这个:

***************************
APPLICATION FAILED TO START
***************************
Description:
The bean 'metaDataSourceAdvisor', defined in null, could not be registered. A bean with that name has already been defined in null and overriding is disabled.
Action:
Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

我得到错误 - 问题是defined in null并不是一个好的指针。我已经看到了这个问题,但我实际上更愿意继续不允许覆盖模棱两可的豆子。

有什么想法吗?


日志输出

2019-01-06 07:33:39.282  INFO 29626 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable
2019-01-06 07:33:39.282  INFO 29626 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : For additional web related logging consider setting the 'logging.level.web' property to 'DEBUG'
2019-01-06 07:33:39.912  INFO 29626 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data repositories in DEFAULT mode.
2019-01-06 07:33:39.997  INFO 29626 --- [  restartedMain] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 80ms. Found 23 repository interfaces.
2019-01-06 07:33:39.999  WARN 29626 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'metaDataSourceAdvisor' defined in null: Cannot register bean definition [Root bean: class [org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean 'metaDataSourceAdvisor': There is already [Root bean: class [org.springframework.security.access.intercept.aopalliance.MethodSecurityMetadataSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
2019-01-06 07:33:40.008  INFO 29626 --- [  restartedMain] ConditionEvaluationReportLoggingListener : 
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2019-01-06 07:33:40.010 ERROR 29626 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

好的,我自己发现了这个问题:我在项目中@EnableGlobalMethodSecurity了两次:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true) // <--
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
}

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"mz.server.spring.repository"})
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true) // <--
@EntityScan(basePackages = "mz.server.hibernate.model")
@EnableTransactionManagement
@EnableScheduling
public class Application {
}

所以我想说这是一个不错的新 Spring 启动功能。

如果您看到此类错误,请注意不需要的重复注释。

根据 Spring Boot 2.1 的发行说明扩展接受的答案

默认情况下,Bean 覆盖已禁用,以防止 Bean 被意外覆盖。如果你依赖于覆盖,则需要将 spring.main.allow-bean-definition-overpreding 设置为 true。

因此,如果您在代码库中多次使用@EnableGlobalMethodSecurity并且这些 bean 是同一组件扫描的一部分,则此注释将尝试多次创建 metaDataSourceAdvisor Bean。这将在初始化期间引发异常。

这也适用于创建 bean 的其他自动配置注释。确保只使用一次其启用注释。

检查您是否错过了添加以下注释(以适用者为准)

  1. @EnableJpaRepositories({"com.base.package"})
  2. @EnableMongoRepositories({"com.base.package"})

这对我有用

我尝试了所有这些答案。但我注意到错误终端在您的属性中显示spring.main.allow-bean-definition-overriding=true。就做吧,它对我有用。

可以帮助在 Gradle 或 Maven 中"清理"和"构建"项目。

最新更新