Spring boot Spring启动集成测试-BeanDefinitionOverrideeException
我有一个Spring引导集成测试,其类定义如下Spring boot Spring启动集成测试-BeanDefinitionOverrideeException,spring-boot,spring-boot-test,Spring Boot,Spring Boot Test,我有一个Spring引导集成测试,其类定义如下 @RunWith(SpringRunner.class) @SpringBootTest(classes = {TestApplication.class}) @Transactional public class AuthorisationManagerControllerRequestIT { ... 我得到以下例外情况: Caused by: org.springframework.beans.factory.support.BeanDef
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {TestApplication.class})
@Transactional
public class AuthorisationManagerControllerRequestIT
{
...
我得到以下例外情况:
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=null; 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=null; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound.
我的TestApplication类定义如下:
@SpringBootApplication
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)
})
@ImportResource({
"classpath:properties-context.xml"
})
public class TestApplication
{
public static void main(String[] args)
{
SpringApplication.run(TestApplication.class, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder location="${CONFIG.ROOT}/external.properties"/>
</beans>
它读取properties-context.xml,其定义如下:
@SpringBootApplication
@ComponentScan(excludeFilters = {
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Application.class)
})
@ImportResource({
"classpath:properties-context.xml"
})
public class TestApplication
{
public static void main(String[] args)
{
SpringApplication.run(TestApplication.class, args);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<context:property-placeholder location="${CONFIG.ROOT}/external.properties"/>
</beans>
这将读取名为external.properties的文件。我在外部属性文件中设置了属性“spring.main.allow bean definition overriding=true”。我之所以添加此项,是因为我在运行应用程序时,出现了相同的异常,但添加此项后不再出现
需要什么来阻止此异常出现在我的集成测试中?考虑到您的错误,这似乎是合乎逻辑的:
org.springframework.beans.factory.support.BeanDefinitionOverrideeException
在spring创建与已创建的bean同名的bean时抛出。属性spring.main.allow bean definition overriding=true
,在spring boot 2的默认情况下被关闭,用于允许bean重写
我不明白的是为什么你有两个关于事务的bean是相同的