From db50de3c1db86ad01a68d753f71ec9cfc2300f71 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 13 Oct 2023 07:43:17 +0100 Subject: [PATCH] Upgrade to MongoDB 4.11.0 Closes gh-37874 --- .../mongo/MongoReactiveAutoConfiguration.java | 13 ++--- .../MongoReactiveAutoConfigurationTests.java | 50 ++++++++----------- .../spring-boot-dependencies/build.gradle | 2 +- 3 files changed, 30 insertions(+), 35 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfiguration.java index 1157e00294..5426b6f17f 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfiguration.java @@ -18,7 +18,7 @@ package org.springframework.boot.autoconfigure.mongo; import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings.Builder; -import com.mongodb.connection.netty.NettyStreamFactoryFactory; +import com.mongodb.connection.TransportSettings; import com.mongodb.reactivestreams.client.MongoClient; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; @@ -113,11 +113,10 @@ public class MongoReactiveAutoConfiguration { @Override public void customize(Builder builder) { - if (!isStreamFactoryFactoryDefined(this.settings.getIfAvailable())) { + if (!isCustomTransportConfiguration(this.settings.getIfAvailable())) { NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup(); this.eventLoopGroup = eventLoopGroup; - builder - .streamFactoryFactory(NettyStreamFactoryFactory.builder().eventLoopGroup(eventLoopGroup).build()); + builder.transportSettings(TransportSettings.nettyBuilder().eventLoopGroup(eventLoopGroup).build()); } } @@ -130,8 +129,10 @@ public class MongoReactiveAutoConfiguration { } } - private boolean isStreamFactoryFactoryDefined(MongoClientSettings settings) { - return settings != null && settings.getStreamFactoryFactory() != null; + @SuppressWarnings("deprecation") + private boolean isCustomTransportConfiguration(MongoClientSettings settings) { + return settings != null + && (settings.getTransportSettings() != null || settings.getStreamFactoryFactory() != null); } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfigurationTests.java index 7f3fe1ef0b..df46e4b459 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoReactiveAutoConfigurationTests.java @@ -23,11 +23,9 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; import com.mongodb.MongoCredential; import com.mongodb.ReadPreference; -import com.mongodb.connection.AsynchronousSocketChannelStreamFactoryFactory; +import com.mongodb.connection.NettyTransportSettings; import com.mongodb.connection.SslSettings; -import com.mongodb.connection.StreamFactory; -import com.mongodb.connection.StreamFactoryFactory; -import com.mongodb.connection.netty.NettyStreamFactoryFactory; +import com.mongodb.connection.TransportSettings; import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.internal.MongoClientImpl; import io.netty.channel.EventLoopGroup; @@ -39,12 +37,8 @@ import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.test.util.ReflectionTestUtils; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; /** * Tests for {@link MongoReactiveAutoConfiguration}. @@ -85,7 +79,7 @@ class MongoReactiveAutoConfigurationTests { assertThat(context).hasSingleBean(MongoClient.class); MongoClientSettings settings = getSettings(context); assertThat(settings.getApplicationName()).isEqualTo("test-config"); - assertThat(settings.getStreamFactoryFactory()).isSameAs(context.getBean("myStreamFactoryFactory")); + assertThat(settings.getTransportSettings()).isSameAs(context.getBean("myTransportSettings")); }); } @@ -212,13 +206,13 @@ class MongoReactiveAutoConfigurationTests { } @Test - void nettyStreamFactoryFactoryIsConfiguredAutomatically() { + void nettyTransportSettingsAreConfiguredAutomatically() { AtomicReference eventLoopGroupReference = new AtomicReference<>(); this.contextRunner.run((context) -> { assertThat(context).hasSingleBean(MongoClient.class); - StreamFactoryFactory factory = getSettings(context).getStreamFactoryFactory(); - assertThat(factory).isInstanceOf(NettyStreamFactoryFactory.class); - EventLoopGroup eventLoopGroup = (EventLoopGroup) ReflectionTestUtils.getField(factory, "eventLoopGroup"); + TransportSettings transportSettings = getSettings(context).getTransportSettings(); + assertThat(transportSettings).isInstanceOf(NettyTransportSettings.class); + EventLoopGroup eventLoopGroup = ((NettyTransportSettings) transportSettings).getEventLoopGroup(); assertThat(eventLoopGroup.isShutdown()).isFalse(); eventLoopGroupReference.set(eventLoopGroup); }); @@ -226,14 +220,17 @@ class MongoReactiveAutoConfigurationTests { } @Test - void customizerOverridesAutoConfig() { + @SuppressWarnings("deprecation") + void customizerWithTransportSettingsOverridesAutoConfig() { this.contextRunner.withPropertyValues("spring.data.mongodb.uri:mongodb://localhost/test?appname=auto-config") - .withUserConfiguration(SimpleCustomizerConfig.class) + .withUserConfiguration(SimpleTransportSettingsCustomizerConfig.class) .run((context) -> { assertThat(context).hasSingleBean(MongoClient.class); MongoClientSettings settings = getSettings(context); - assertThat(settings.getApplicationName()).isEqualTo("overridden-name"); - assertThat(settings.getStreamFactoryFactory()).isEqualTo(SimpleCustomizerConfig.streamFactoryFactory); + assertThat(settings.getApplicationName()).isEqualTo("custom-transport-settings"); + assertThat(settings.getTransportSettings()) + .isSameAs(SimpleTransportSettingsCustomizerConfig.transportSettings); + assertThat(settings.getStreamFactoryFactory()).isNull(); }); } @@ -278,32 +275,29 @@ class MongoReactiveAutoConfigurationTests { static class SslSettingsConfig { @Bean - MongoClientSettings mongoClientSettings(StreamFactoryFactory streamFactoryFactory) { + MongoClientSettings mongoClientSettings(TransportSettings transportSettings) { return MongoClientSettings.builder() .applicationName("test-config") - .streamFactoryFactory(streamFactoryFactory) + .transportSettings(transportSettings) .build(); } @Bean - StreamFactoryFactory myStreamFactoryFactory() { - StreamFactoryFactory streamFactoryFactory = mock(StreamFactoryFactory.class); - given(streamFactoryFactory.create(any(), any())).willReturn(mock(StreamFactory.class)); - return streamFactoryFactory; + TransportSettings myTransportSettings() { + return TransportSettings.nettyBuilder().build(); } } @Configuration(proxyBeanMethods = false) - static class SimpleCustomizerConfig { + static class SimpleTransportSettingsCustomizerConfig { - private static final StreamFactoryFactory streamFactoryFactory = new AsynchronousSocketChannelStreamFactoryFactory.Builder() - .build(); + private static final TransportSettings transportSettings = TransportSettings.nettyBuilder().build(); @Bean MongoClientSettingsBuilderCustomizer customizer() { - return (clientSettingsBuilder) -> clientSettingsBuilder.applicationName("overridden-name") - .streamFactoryFactory(streamFactoryFactory); + return (clientSettingsBuilder) -> clientSettingsBuilder.applicationName("custom-transport-settings") + .transportSettings(transportSettings); } } diff --git a/spring-boot-project/spring-boot-dependencies/build.gradle b/spring-boot-project/spring-boot-dependencies/build.gradle index 2abeb6c946..f63ba98355 100644 --- a/spring-boot-project/spring-boot-dependencies/build.gradle +++ b/spring-boot-project/spring-boot-dependencies/build.gradle @@ -1023,7 +1023,7 @@ bom { ] } } - library("MongoDB", "4.10.2") { + library("MongoDB", "4.11.0") { group("org.mongodb") { modules = [ "bson",