Статьи

Spring-Boot 2.1.x и определение переопределенного бина

Недавно я переносил приложение из Spring Boot 1.5.X в Spring Boot 2.X и увидел проблему с переопределением определений Spring Bean. Одна из конфигураций была в этих направлениях в Котлине:

1
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Configuration class DynamoConfig { @Bean fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient { ... } @Bean fun dynampoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient { ... } }</span> @Configuration class DynamoConfig {@Bean fun DynamoDbAsyncClient (DynamoProperties: DynamoProperties): DynamoDbAsyncClient {...} @Bean fun dynampoDbSyncClient (DynamoProperties: DynamoProperties): DynamoDbClient {...}}</span>

Теперь для теста я хотел переопределить эти 2 определения бинов и сделал что-то вроде этого:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootTest</span> @SpringBootTest</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class DynamoConfigTest {</span> class DynamoConfigTest {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Test</span> @Тест</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun saveHotel() {</span> весело saveHotel () {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!)</span> val hotelRepo = DynamoHotelRepo (localDynamoExtension.asyncClient !!)</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")</span> val hotel = Hotel (id = "1", name = "тестовый отель", address = "тестовый адрес", state = "OR", zip = "zip")</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val resp = hotelRepo.saveHotel(hotel)</span> val resp = hotelRepo.saveHotel (отель)</span>
 
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">StepVerifier.create(resp)</span> StepVerifier.create (соответственно)</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.expectNext(hotel)</span> .expectNext (отель)</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.expectComplete()</span> .expectComplete ()</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.verify()</span> .verify ()</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
 
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@TestConfiguration</span> @TestConfiguration</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class SpringConfig {</span> class SpringConfig {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Bean</span> @Bean</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient {</span> забавный DynamoDbAsyncClient (DynamoProperties: DynamoProperties): DynamoDbAsyncClient {</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
 
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Bean</span> @Bean</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient {</span> забавный DynamoDbSyncClient (DynamoProperties: DynamoProperties): DynamoDbClient {</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Этот тип переопределения работает с Spring Boot 1.5.X, но завершается с Spring Boot 2.1.X с ошибкой:

1
2
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">Invalid bean definition with name 'dynamoDbAsyncClient' defined in sample.dyn.repo.DynamoConfigTest$SpringConfig:..</span> Неверное определение bean-компонента с именем «dynamicoDbAsyncClient», определенное в sample.dyn.repo.DynamoConfigTest $ SpringConfig: ..</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">There is already .. defined in class path resource [sample/dyn/config/DynamoConfig.class]] bound</span> Там уже .. определено в пути к ресурсам класса [sample / dyn / config / DynamoConfig.class]] привязано</span>

Я чувствую, что это правильное поведение, не позволяя переопределять bean-компоненты таким образом, это правильное поведение по умолчанию для приложения, однако я хочу иметь возможность переопределять bean-компоненты для тестов и благодаря ответу Stack Overflow и примечаниям к выпуску Spring Boot 2.1.X исправление состоит в том, чтобы разрешить переопределения, используя свойство «spring.main.allow-bean-definition-overriding = true», поэтому с этим изменением тест выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@SpringBootTest(properties = ["spring.main.allow-bean-definition-overriding=true"])</span> @SpringBootTest (properties = ["spring.main.allow-bean-definition-overriding = true"])</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class DynamoConfigTest {</span> class DynamoConfigTest {</span>
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Test</span> @Тест</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun saveHotel() {</span> весело saveHotel () {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val hotelRepo = DynamoHotelRepo(localDynamoExtension.asyncClient!!)</span> val hotelRepo = DynamoHotelRepo (localDynamoExtension.asyncClient !!)</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val hotel = Hotel(id = "1", name = "test hotel", address = "test address", state = "OR", zip = "zip")</span> val hotel = Hotel (id = "1", name = "тестовый отель", address = "тестовый адрес", state = "OR", zip = "zip")</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">val resp = hotelRepo.saveHotel(hotel)</span> val resp = hotelRepo.saveHotel (отель)</span>
 
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">StepVerifier.create(resp)</span> StepVerifier.create (соответственно)</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.expectNext(hotel)</span> .expectNext (отель)</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.expectComplete()</span> .expectComplete ()</span>
                <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">.verify()</span> .verify ()</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
 
 
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@TestConfiguration</span> @TestConfiguration</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">class SpringConfig {</span> class SpringConfig {</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Bean</span> @Bean</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun dynamoDbAsyncClient(dynamoProperties: DynamoProperties): DynamoDbAsyncClient {</span> забавный DynamoDbAsyncClient (DynamoProperties: DynamoProperties): DynamoDbAsyncClient {</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
 
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">@Bean</span> @Bean</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">fun dynamoDbSyncClient(dynamoProperties: DynamoProperties): DynamoDbClient {</span> забавный DynamoDbSyncClient (DynamoProperties: DynamoProperties): DynamoDbClient {</span>
            <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">...</span> ...</span>
        <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
    <span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>
<span class="notranslate" onmouseover="_tipon(this)" onmouseout="_tipoff()"><span class="google-src-text" style="direction: ltr; text-align: left">}</span> }</span>

Смотрите оригинальную статью здесь: Spring-Boot 2.1.x и определение переопределенного бина

Мнения, высказанные участниками Java Code Geeks, являются их собственными.