Skip to content

Commit a465cee

Browse files
committed
Add spring.data.mongodb.protocol property
This commit allows configuring the MongoDB connection protocol using the 'spring.data.mongodb.protocol' property. See gh-43851 Signed-off-by: Dmytro Nosan <[email protected]>
1 parent 11cdc63 commit a465cee

File tree

5 files changed

+63
-2
lines changed

5 files changed

+63
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoProperties.java

+13
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ public class MongoProperties {
5151
*/
5252
public static final String DEFAULT_URI = "mongodb://localhost/test";
5353

54+
/**
55+
* Protocol to be used for the MongoDB connection. Ignored if 'uri' is set.
56+
*/
57+
private String protocol = "mongodb";
58+
5459
/**
5560
* Mongo server host. Ignored if 'uri' is set.
5661
*/
@@ -117,6 +122,14 @@ public class MongoProperties {
117122
*/
118123
private Boolean autoIndexCreation;
119124

125+
public void setProtocol(String protocol) {
126+
this.protocol = protocol;
127+
}
128+
129+
public String getProtocol() {
130+
return this.protocol;
131+
}
132+
120133
public String getHost() {
121134
return this.host;
122135
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetails.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,11 @@ public PropertiesMongoConnectionDetails(MongoProperties properties, SslBundles s
5151

5252
@Override
5353
public ConnectionString getConnectionString() {
54-
// mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]]
54+
// protocol://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database.collection][?options]]
5555
if (this.properties.getUri() != null) {
5656
return new ConnectionString(this.properties.getUri());
5757
}
58-
StringBuilder builder = new StringBuilder("mongodb://");
58+
StringBuilder builder = new StringBuilder(getProtocol()).append("://");
5959
if (this.properties.getUsername() != null) {
6060
builder.append(encode(this.properties.getUsername()));
6161
builder.append(":");
@@ -83,6 +83,14 @@ public ConnectionString getConnectionString() {
8383
return new ConnectionString(builder.toString());
8484
}
8585

86+
private String getProtocol() {
87+
String protocol = this.properties.getProtocol();
88+
if (StringUtils.hasText(protocol)) {
89+
return protocol;
90+
}
91+
return "mongodb";
92+
}
93+
8694
private String encode(String input) {
8795
return URLEncoder.encode(input, StandardCharsets.UTF_8);
8896
}

spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

+16
Original file line numberDiff line numberDiff line change
@@ -2924,6 +2924,22 @@
29242924
}
29252925
]
29262926
},
2927+
{
2928+
"name": "spring.data.mongodb.protocol",
2929+
"values": [
2930+
{
2931+
"value": "mongodb"
2932+
},
2933+
{
2934+
"value": "mongodb+srv"
2935+
}
2936+
],
2937+
"providers": [
2938+
{
2939+
"name": "any"
2940+
}
2941+
]
2942+
},
29272943
{
29282944
"name": "spring.data.redis.lettuce.read-from",
29292945
"values": [

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoAutoConfigurationTests.java

+17
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.mongodb.client.MongoClient;
2525
import com.mongodb.client.MongoClients;
2626
import com.mongodb.client.internal.MongoClientImpl;
27+
import com.mongodb.connection.ClusterConnectionMode;
2728
import com.mongodb.connection.SslSettings;
2829
import org.junit.jupiter.api.Test;
2930

@@ -98,6 +99,22 @@ void configuresSslWithBundle() {
9899
});
99100
}
100101

102+
@Test
103+
void configuresProtocol() {
104+
this.contextRunner.withPropertyValues("spring.data.mongodb.protocol=mongodb+srv").run((context) -> {
105+
MongoClientSettings settings = getSettings(context);
106+
assertThat(settings.getClusterSettings().getMode()).isEqualTo(ClusterConnectionMode.MULTIPLE);
107+
});
108+
}
109+
110+
@Test
111+
void defaultProtocol() {
112+
this.contextRunner.run((context) -> {
113+
MongoClientSettings settings = getSettings(context);
114+
assertThat(settings.getClusterSettings().getMode()).isEqualTo(ClusterConnectionMode.SINGLE);
115+
});
116+
}
117+
101118
@Test
102119
void configuresWithoutSslWhenDisabledWithBundle() {
103120
this.contextRunner

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/PropertiesMongoConnectionDetailsTests.java

+7
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ void databaseHasDefaultWhenNotConfigured() {
8686
assertThat(connectionString.getDatabase()).isEqualTo("test");
8787
}
8888

89+
@Test
90+
void protocolCanBeConfigured() {
91+
this.properties.setProtocol("mongodb+srv");
92+
ConnectionString connectionString = this.connectionDetails.getConnectionString();
93+
assertThat(connectionString.getConnectionString()).startsWith("mongodb+srv://");
94+
}
95+
8996
@Test
9097
void authenticationDatabaseCanBeConfigured() {
9198
this.properties.setUsername("user");

0 commit comments

Comments
 (0)