我最近将应用程序从Spring Boot 1.5.X迁移到Spring Boot 2.X ,发现覆盖Spring Bean定义存在问题。 其中一种配置是在Kotlin中遵循的:
@Configuration
class DynamoConfig {@Beanfun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient {...}@Beanfun dynampoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient {...}
}
现在,为了进行测试,我想覆盖这两个bean定义,并按照以下原则进行操作:
@SpringBootTest
class DynamoConfigTest {@Testfun saveHotel() {val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!)val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")val resp = hotelRepo.saveHotel(hotel)StepVerifier.create(resp).expectNext(hotel).expectComplete().verify()}@TestConfigurationclass SpringConfig {@Beanfun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient {...}@Beanfun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient {...}}
}
这种覆盖类型适用于Spring Boot 1.5.X,但不适用于Spring Boot 2.1.X,并显示以下错误:
Invalid bean definition with name 'dynamoDbAsyncClient' defined in sample.dyn.repo.DynamoConfigTest$SpringConfig:..
There is already .. defined in class path resource [sample/dyn/config/DynamoConfig.class]] bound
我认为这种行为是正确的,不允许以这种方式覆盖bean是应用程序的正确默认行为,但是我确实希望能够覆盖bean进行测试,这要归功于Stack Overflow答案和Spring Boot 2.1.X发行说明 ,解决方法是允许使用属性“ spring.main.allow-bean-definition-overriding = true”进行覆盖,因此,通过进行此更改,测试如下所示:
@SpringBootTest(properties = ["spring.main.allow-bean-definition-overriding=true"])
class DynamoConfigTest {@Testfun saveHotel() {val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!)val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")val resp = hotelRepo.saveHotel(hotel)StepVerifier.create(resp).expectNext(hotel).expectComplete().verify()}@TestConfigurationclass SpringConfig {@Beanfun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient {...}@Beanfun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient {...}}
}
翻译自: https://www.javacodegeeks.com/2019/01/spring-boot-overriding-bean-definition.html