diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java index 12445f0112a7..207db93377c6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java @@ -51,6 +51,11 @@ public class MongoProperties { */ public static final String DEFAULT_URI = "mongodb://localhost/test"; + /** + * Protocol to be used for the MongoDB connection. Ignored if 'uri' is set. + */ + private String protocol = "mongodb"; + /** * Mongo server host. Ignored if 'uri' is set. */ @@ -117,6 +122,14 @@ public class MongoProperties { */ private Boolean autoIndexCreation; + public void setProtocol(String protocol) { + this.protocol = protocol; + } + + public String getProtocol() { + return this.protocol; + } + public String getHost() { return this.host; } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetails.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetails.java index ba8405fd8cb9..a74ccf80f5a6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetails.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetails.java @@ -51,11 +51,11 @@ public PropertiesMongoConnectionDetails(MongoProperties properties, SslBundles s @Override public ConnectionString getConnectionString() { - // mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]] + // protocol://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]] if (this.properties.getUri() != null) { return new ConnectionString(this.properties.getUri()); } - StringBuilder builder = new StringBuilder("mongodb://"); + StringBuilder builder = new StringBuilder(getProtocol()).append("://"); if (this.properties.getUsername() != null) { builder.append(encode(this.properties.getUsername())); builder.append(":"); @@ -83,6 +83,14 @@ public ConnectionString getConnectionString() { return new ConnectionString(builder.toString()); } + private String getProtocol() { + String protocol = this.properties.getProtocol(); + if (StringUtils.hasText(protocol)) { + return protocol; + } + return "mongodb"; + } + private String encode(String input) { return URLEncoder.encode(input, StandardCharsets.UTF_8); } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 9d9dd4b2081a..da4f173eae2b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -2924,6 +2924,22 @@ } ] }, + { + "name": "spring.data.mongodb.protocol", + "values": [ + { + "value": "mongodb" + }, + { + "value": "mongodb+srv" + } + ], + "providers": [ + { + "name": "any" + } + ] + }, { "name": "spring.data.redis.lettuce.read-from", "values": [ diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfigurationTests.java index 8667698a0f0d..be78b39ca336 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfigurationTests.java @@ -24,6 +24,7 @@ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import com.mongodb.client.internal.MongoClientImpl; +import com.mongodb.connection.ClusterConnectionMode; import com.mongodb.connection.SslSettings; import org.junit.jupiter.api.Test; @@ -98,6 +99,22 @@ void configuresSslWithBundle() { }); } + @Test + void configuresProtocol() { + this.contextRunner.withPropertyValues("spring.data.mongodb.protocol=mongodb+srv").run((context) -> { + MongoClientSettings settings = getSettings(context); + assertThat(settings.getClusterSettings().getMode()).isEqualTo(ClusterConnectionMode.MULTIPLE); + }); + } + + @Test + void defaultProtocol() { + this.contextRunner.run((context) -> { + MongoClientSettings settings = getSettings(context); + assertThat(settings.getClusterSettings().getMode()).isEqualTo(ClusterConnectionMode.SINGLE); + }); + } + @Test void configuresWithoutSslWhenDisabledWithBundle() { this.contextRunner diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetailsTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetailsTests.java index 6412a1b83208..eb9b6878b335 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetailsTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetailsTests.java @@ -86,6 +86,13 @@ void databaseHasDefaultWhenNotConfigured() { assertThat(connectionString.getDatabase()).isEqualTo("test"); } + @Test + void protocolCanBeConfigured() { + this.properties.setProtocol("mongodb+srv"); + ConnectionString connectionString = this.connectionDetails.getConnectionString(); + assertThat(connectionString.getConnectionString()).startsWith("mongodb+srv://"); + } + @Test void authenticationDatabaseCanBeConfigured() { this.properties.setUsername("user");