Skip to content

Commit 1996952

Browse files
committed
Update RSocket configuration after Framework changes
Since spring-projects/spring-framework#23314, the `RSocketStrategies` provide more codecs by default, and there is no need to order them to avoid conflicts during mime type selection. This commit also ensures that the `PayloadDecoder.ZERO_COPY` is configured on the RSocket server if the configured `DataBufferFactory` is compatible with that strategy.
1 parent 5a4ec08 commit 1996952

File tree

5 files changed

+37
-26
lines changed

5 files changed

+37
-26
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketServerAutoConfiguration.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import java.util.stream.Collectors;
2020

2121
import io.rsocket.RSocketFactory;
22+
import io.rsocket.frame.decoder.PayloadDecoder;
2223
import io.rsocket.transport.netty.server.TcpServerTransport;
2324
import reactor.netty.http.server.HttpServer;
2425

@@ -40,6 +41,7 @@
4041
import org.springframework.context.annotation.Bean;
4142
import org.springframework.context.annotation.Conditional;
4243
import org.springframework.context.annotation.Configuration;
44+
import org.springframework.core.io.buffer.NettyDataBufferFactory;
4345
import org.springframework.http.client.reactive.ReactorResourceFactory;
4446
import org.springframework.messaging.rsocket.RSocketStrategies;
4547
import org.springframework.messaging.rsocket.annotation.support.RSocketMessageHandler;
@@ -104,6 +106,18 @@ RSocketServerBootstrap rSocketServerBootstrap(RSocketServerFactory rSocketServer
104106
return new RSocketServerBootstrap(rSocketServerFactory, rSocketMessageHandler.serverResponder());
105107
}
106108

109+
@Bean
110+
ServerRSocketFactoryCustomizer frameDecoderServerFactoryCustomizer(
111+
RSocketMessageHandler rSocketMessageHandler) {
112+
return (serverRSocketFactory) -> {
113+
if (rSocketMessageHandler.getRSocketStrategies()
114+
.dataBufferFactory() instanceof NettyDataBufferFactory) {
115+
return serverRSocketFactory.frameDecoder(PayloadDecoder.ZERO_COPY);
116+
}
117+
return serverRSocketFactory;
118+
};
119+
}
120+
107121
}
108122

109123
static class OnRSocketWebServerCondition extends AllNestedConditions {

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/rsocket/RSocketStrategiesAutoConfiguration.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@
3131
import org.springframework.boot.rsocket.messaging.RSocketStrategiesCustomizer;
3232
import org.springframework.context.annotation.Bean;
3333
import org.springframework.context.annotation.Configuration;
34-
import org.springframework.core.ReactiveAdapterRegistry;
35-
import org.springframework.core.annotation.Order;
36-
import org.springframework.core.codec.CharSequenceEncoder;
37-
import org.springframework.core.codec.StringDecoder;
38-
import org.springframework.core.io.buffer.NettyDataBufferFactory;
3934
import org.springframework.http.MediaType;
4035
import org.springframework.http.codec.cbor.Jackson2CborDecoder;
4136
import org.springframework.http.codec.cbor.Jackson2CborEncoder;
@@ -59,11 +54,7 @@ public class RSocketStrategiesAutoConfiguration {
5954
@ConditionalOnMissingBean
6055
public RSocketStrategies rSocketStrategies(ObjectProvider<RSocketStrategiesCustomizer> customizers) {
6156
RSocketStrategies.Builder builder = RSocketStrategies.builder();
62-
builder.reactiveAdapterStrategy(ReactiveAdapterRegistry.getSharedInstance());
6357
customizers.orderedStream().forEach((customizer) -> customizer.customize(builder));
64-
builder.decoder(StringDecoder.allMimeTypes());
65-
builder.encoder(CharSequenceEncoder.allMimeTypes());
66-
builder.dataBufferFactory(new NettyDataBufferFactory(PooledByteBufAllocator.DEFAULT));
6758
return builder.build();
6859
}
6960

@@ -74,7 +65,6 @@ protected static class JacksonCborStrategyConfiguration {
7465
private static final MediaType[] SUPPORTED_TYPES = { MediaType.APPLICATION_CBOR };
7566

7667
@Bean
77-
@Order(0)
7868
@ConditionalOnBean(Jackson2ObjectMapperBuilder.class)
7969
public RSocketStrategiesCustomizer jacksonCborRSocketStrategyCustomizer(Jackson2ObjectMapperBuilder builder) {
8070
return (strategy) -> {
@@ -94,7 +84,6 @@ protected static class JacksonJsonStrategyConfiguration {
9484
new MediaType("application", "*+json") };
9585

9686
@Bean
97-
@Order(1)
9887
@ConditionalOnBean(ObjectMapper.class)
9988
public RSocketStrategiesCustomizer jacksonJsonRSocketStrategyCustomizer(ObjectMapper objectMapper) {
10089
return (strategy) -> {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketServerAutoConfigurationTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.boot.autoconfigure.AutoConfigurations;
2222
import org.springframework.boot.rsocket.server.RSocketServerBootstrap;
2323
import org.springframework.boot.rsocket.server.RSocketServerFactory;
24+
import org.springframework.boot.rsocket.server.ServerRSocketFactoryCustomizer;
2425
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2526
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
2627
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
@@ -75,7 +76,8 @@ void shouldCreateDefaultBeansForReactiveWebApp() {
7576
void shouldCreateDefaultBeansForRSocketServerWhenPortIsSet() {
7677
reactiveWebContextRunner().withPropertyValues("spring.rsocket.server.port=0")
7778
.run((context) -> assertThat(context).hasSingleBean(RSocketServerFactory.class)
78-
.hasSingleBean(RSocketServerBootstrap.class));
79+
.hasSingleBean(RSocketServerBootstrap.class)
80+
.hasSingleBean(ServerRSocketFactoryCustomizer.class));
7981
}
8082

8183
@Test

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketStrategiesAutoConfigurationTests.java

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2525
import org.springframework.context.annotation.Bean;
2626
import org.springframework.context.annotation.Configuration;
27-
import org.springframework.core.codec.ByteArrayDecoder;
28-
import org.springframework.core.codec.ByteArrayEncoder;
2927
import org.springframework.core.codec.CharSequenceEncoder;
28+
import org.springframework.core.codec.Decoder;
29+
import org.springframework.core.codec.Encoder;
3030
import org.springframework.core.codec.StringDecoder;
3131
import org.springframework.http.codec.cbor.Jackson2CborDecoder;
3232
import org.springframework.http.codec.cbor.Jackson2CborEncoder;
@@ -35,6 +35,7 @@
3535
import org.springframework.messaging.rsocket.RSocketStrategies;
3636

3737
import static org.assertj.core.api.Assertions.assertThat;
38+
import static org.mockito.Mockito.mock;
3839

3940
/**
4041
* Tests for {@link RSocketStrategiesAutoConfiguration}
@@ -51,14 +52,10 @@ void shouldCreateDefaultBeans() {
5152
this.contextRunner.run((context) -> {
5253
assertThat(context).getBeans(RSocketStrategies.class).hasSize(1);
5354
RSocketStrategies strategies = context.getBean(RSocketStrategies.class);
54-
assertThat(strategies.decoders()).hasSize(3);
55-
assertThat(strategies.decoders().get(0)).isInstanceOf(Jackson2CborDecoder.class);
56-
assertThat(strategies.decoders().get(1)).isInstanceOf(Jackson2JsonDecoder.class);
57-
assertThat(strategies.decoders().get(2)).isInstanceOf(StringDecoder.class);
58-
assertThat(strategies.encoders()).hasSize(3);
59-
assertThat(strategies.encoders().get(0)).isInstanceOf(Jackson2CborEncoder.class);
60-
assertThat(strategies.encoders().get(1)).isInstanceOf(Jackson2JsonEncoder.class);
61-
assertThat(strategies.encoders().get(2)).isInstanceOf(CharSequenceEncoder.class);
55+
assertThat(strategies.decoders()).hasAtLeastOneElementOfType(Jackson2CborDecoder.class)
56+
.hasAtLeastOneElementOfType(Jackson2JsonDecoder.class);
57+
assertThat(strategies.encoders()).hasAtLeastOneElementOfType(Jackson2CborEncoder.class)
58+
.hasAtLeastOneElementOfType(Jackson2JsonEncoder.class);
6259
});
6360
}
6461

@@ -75,8 +72,8 @@ void shouldUseStrategiesCustomizer() {
7572
this.contextRunner.withUserConfiguration(StrategiesCustomizer.class).run((context) -> {
7673
assertThat(context).getBeans(RSocketStrategies.class).hasSize(1);
7774
RSocketStrategies strategies = context.getBean(RSocketStrategies.class);
78-
assertThat(strategies.decoders()).hasSize(4).hasAtLeastOneElementOfType(ByteArrayDecoder.class);
79-
assertThat(strategies.encoders()).hasSize(4).hasAtLeastOneElementOfType(ByteArrayEncoder.class);
75+
assertThat(strategies.decoders()).hasAtLeastOneElementOfType(CustomDecoder.class);
76+
assertThat(strategies.encoders()).hasAtLeastOneElementOfType(CustomEncoder.class);
8077
});
8178
}
8279

@@ -96,9 +93,17 @@ static class StrategiesCustomizer {
9693

9794
@Bean
9895
RSocketStrategiesCustomizer myCustomizer() {
99-
return (strategies) -> strategies.encoder(new ByteArrayEncoder()).decoder(new ByteArrayDecoder());
96+
return (strategies) -> strategies.encoder(mock(CustomEncoder.class)).decoder(mock(CustomDecoder.class));
10097
}
10198

10299
}
103100

101+
interface CustomEncoder extends Encoder<String> {
102+
103+
}
104+
105+
interface CustomDecoder extends Decoder<String> {
106+
107+
}
108+
104109
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/rsocket/RSocketWebSocketNettyRouteProviderTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ private WebTestClient createWebTestClient(WebServer server) {
8686
private RSocketRequester createRSocketRequester(ApplicationContext context, WebServer server) {
8787
int port = server.getPort();
8888
RSocketRequester.Builder builder = context.getBean(RSocketRequester.Builder.class);
89-
return builder.connectWebSocket(URI.create("ws://localhost:" + port + "/rsocket")).block();
89+
return builder.dataMimeType(MediaType.APPLICATION_CBOR)
90+
.connectWebSocket(URI.create("ws://localhost:" + port + "/rsocket")).block();
9091
}
9192

9293
@Configuration(proxyBeanMethods = false)

0 commit comments

Comments
 (0)