diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfiguration.java index 9028ea1320..9cabe26cd4 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfiguration.java @@ -19,6 +19,7 @@ package org.springframework.boot.autoconfigure.rsocket; import io.rsocket.transport.netty.server.TcpServerTransport; import reactor.netty.http.server.HttpServer; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; @@ -26,6 +27,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; +import org.springframework.messaging.rsocket.RSocketConnectorConfigurer; import org.springframework.messaging.rsocket.RSocketRequester; import org.springframework.messaging.rsocket.RSocketStrategies; @@ -37,6 +39,7 @@ import org.springframework.messaging.rsocket.RSocketStrategies; * requester instances with different configurations. * * @author Brian Clozel + * @author Nguyen Bao Sach * @since 2.2.0 */ @Configuration(proxyBeanMethods = false) @@ -47,8 +50,11 @@ public class RSocketRequesterAutoConfiguration { @Bean @Scope("prototype") @ConditionalOnMissingBean - public RSocketRequester.Builder rSocketRequesterBuilder(RSocketStrategies strategies) { - return RSocketRequester.builder().rsocketStrategies(strategies); + public RSocketRequester.Builder rSocketRequesterBuilder(RSocketStrategies strategies, + ObjectProvider connectorConfigurers) { + return connectorConfigurers.orderedStream() + .collect(RSocketRequester::builder, RSocketRequester.Builder::rsocketConnector, (first, second) -> { + }).rsocketStrategies(strategies); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfigurationTests.java index edebbc3c00..a42304e47e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketRequesterAutoConfigurationTests.java @@ -16,14 +16,17 @@ package org.springframework.boot.autoconfigure.rsocket; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.messaging.rsocket.RSocketConnectorConfigurer; import org.springframework.messaging.rsocket.RSocketRequester; +import static org.assertj.core.api.Assertions.as; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -31,6 +34,7 @@ import static org.mockito.Mockito.mock; * Tests for {@link RSocketRequesterAutoConfiguration} * * @author Brian Clozel + * @author Nguyen Bao Sach */ class RSocketRequesterAutoConfigurationTests { @@ -59,6 +63,21 @@ class RSocketRequesterAutoConfigurationTests { }); } + @Test + void rSocketConnectorConfigurersArePickedUp() { + RSocketConnectorConfigurer first = mock(RSocketConnectorConfigurer.class); + RSocketConnectorConfigurer second = mock(RSocketConnectorConfigurer.class); + this.contextRunner.withBean("firstRSocketConnectorConfigurer", RSocketConnectorConfigurer.class, () -> first) + .withBean("secondRSocketConnectorConfigurer", RSocketConnectorConfigurer.class, () -> second) + .run((context) -> { + assertThat(context).getBeans(RSocketConnectorConfigurer.class).hasSize(2); + + RSocketRequester.Builder builder = context.getBean(RSocketRequester.Builder.class); + assertThat(builder).extracting("rsocketConnectorConfigurers", as(InstanceOfAssertFactories.LIST)) + .containsExactly(first, second); + }); + } + @Configuration(proxyBeanMethods = false) static class CustomRSocketRequesterBuilder {