java - spring.main.allow-bean-definition-overriding=true 是一种不好的做法吗

标签 java spring spring-boot

我正在构建一个 Spring Boot Rest API 服务器,以将遗留应用程序移植到一个更健壮的框架上。那是我使用这些技术的第一个项目。到目前为止,我已经使用 2 个回复“Hello world!”的 API 构建了概念验证。在 JSON 中。一个是开放的,另一个是使用 OAuth2 保护的。我已根据要求调整安全性。

我还结合使用 Rest-Assured 进行集成测试和 Spring MockMvc 进行单元测试,构建了一个强大的测试结构,因此我相信我已经准备好开始使用 TDD 方法实现真正​​的 API。

我们正在使用 Maven。我的问题是,一旦我对现有工件产生依赖性,我就会得到以下堆栈。我明白这意味着什么,但我们的代码库很大,我不知道这是从哪里来的。当我向谷歌询问这个问题时,我经常发现结果只是建议将 spring.main.allow-bean-definition-overriding=true 添加到我的属性中。这不是把问题掩盖起来吗?我猜想 Spring 默认不允许这样做是有充分理由的。使用方便的应用程序属性简单地忽略该错误可能会产生什么后果?

堆栈:

*************************** APPLICATION FAILED TO START
***************************

Description:

The bean 'org.springframework.transaction.config.internalTransactionAdvisor', defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class], 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

[WARNING]  java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558)
    at java.lang.Thread.run (Thread.java:748) Caused by: org.springframework.beans.factory.support.BeanDefinitionOverrideException: Invalid bean definition with name 'org.springframework.transaction.config.internalTransactionAdvisor' defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: Cannot register bean definition [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration; factoryMethodName=transactionAdvisor; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]] for bean 'org.springframework.transaction.config.internalTransactionAdvisor': There is already [Root bean: class [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.registerBeanDefinition (DefaultListableBeanFactory.java:897)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForBeanMethod (ConfigurationClassBeanDefinitionReader.java:274)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass (ConfigurationClassBeanDefinitionReader.java:141)
    at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions (ConfigurationClassBeanDefinitionReader.java:117)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions (ConfigurationClassPostProcessor.java:327)
    at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry (ConfigurationClassPostProcessor.java:232)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors (PostProcessorRegistrationDelegate.java:275)
    at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors (PostProcessorRegistrationDelegate.java:95)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors (AbstractApplicationContext.java:705)
    at org.springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:531)
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh (ServletWebServerApplicationContext.java:142)
    at org.springframework.boot.SpringApplication.refresh (SpringApplication.java:775)
    at org.springframework.boot.SpringApplication.refreshContext (SpringApplication.java:397)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:316)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1260)
    at org.springframework.boot.SpringApplication.run (SpringApplication.java:1248)
    at ca.mycompany.oav.ResourceServerApplication.main (ResourceServerApplication.java:22)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.springframework.boot.maven.AbstractRunMojo$LaunchRunner.run (AbstractRunMojo.java:558)
    at java.lang.Thread.run (Thread.java:748)

最佳答案

只是要注意:通过添加这个,很难猜测哪个 bean 将具有优先级,因为 bean 创建顺序是由运行时主要影响的依赖关系决定的。因此,允许 bean 覆盖除非我们足够了解 bean 的依赖层次结构,否则可能会产生意想不到的行为。

Reference

关于java - spring.main.allow-bean-definition-overriding=true 是一种不好的做法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56188981/

相关文章:

java - Jersey @Path 注释在类级别是必需的

java - 一旦图像被打包到 jar 中,如何引用图像?

java - 如何获取有关第一个 Activity 的按钮单击的信息并在第三个 Activity 中使用它? - 安卓

Java 允许将字节分配给 java.lang.Short 但不允许分配给 java.lang.Integer

java - gRPC-java 服务器在负载下处理请求和发送响应的延迟

spring - Spring Boot 应用程序中特定于环境的 application.properties 文件

java - Spring-Boot 中的多个数据库与 mariaDB

spring - 如何使用 Spring Data JPA 启用基本缓存

java - 百里香与瓷砖

java - spring TransactionTemplate 和 SimpleJdbcTemplate 是线程安全的吗?