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 3a8d6511c1..d8c96fb438 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 @@ -16,6 +16,8 @@ package org.springframework.boot.autoconfigure.mongo; +import java.util.List; + import com.mongodb.ConnectionString; import org.bson.UuidRepresentation; @@ -33,6 +35,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @author Nasko Vasilev * @author Mark Paluch * @author Artsiom Yudovin + * @author Safeer Ansari * @since 1.0.0 */ @ConfigurationProperties(prefix = "spring.data.mongodb") @@ -58,6 +61,13 @@ public class MongoProperties { */ private Integer port = null; + /** + * Additional server hosts. Cannot be set with URI or if 'host' is not specified. + * Additional hosts will use the default mongo port of 27017, if you want to use a + * different port you can use the "host:port" syntax. + */ + private List additionalHosts; + /** * Mongo database URI. Overrides host, port, username, password, and database. */ @@ -208,6 +218,14 @@ public class MongoProperties { this.autoIndexCreation = autoIndexCreation; } + public List getAdditionalHosts() { + return this.additionalHosts; + } + + public void setAdditionalHosts(List additionalHosts) { + this.additionalHosts = additionalHosts; + } + public static class Gridfs { /** diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizer.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizer.java index 4f12bbfcb9..df645ae837 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizer.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizer.java @@ -16,7 +16,8 @@ package org.springframework.boot.autoconfigure.mongo; -import java.util.Collections; +import java.util.ArrayList; +import java.util.List; import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; @@ -24,12 +25,14 @@ import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import org.springframework.core.Ordered; +import org.springframework.util.CollectionUtils; /** * A {@link MongoClientSettingsBuilderCustomizer} that applies properties from a * {@link MongoProperties} to a {@link MongoClientSettings}. * * @author Scott Frederick + * @author Safeer Ansari * @since 2.4.0 */ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClientSettingsBuilderCustomizer, Ordered { @@ -62,8 +65,12 @@ public class MongoPropertiesClientSettingsBuilderCustomizer implements MongoClie if (this.properties.getHost() != null || this.properties.getPort() != null) { String host = getOrDefault(this.properties.getHost(), "localhost"); int port = getOrDefault(this.properties.getPort(), MongoProperties.DEFAULT_PORT); - ServerAddress serverAddress = new ServerAddress(host, port); - settings.applyToClusterSettings((cluster) -> cluster.hosts(Collections.singletonList(serverAddress))); + List serverAddresses = new ArrayList<>(); + serverAddresses.add(new ServerAddress(host, port)); + if (!CollectionUtils.isEmpty(this.properties.getAdditionalHosts())) { + this.properties.getAdditionalHosts().stream().map(ServerAddress::new).forEach(serverAddresses::add); + } + settings.applyToClusterSettings((cluster) -> cluster.hosts(serverAddresses)); return; } settings.applyConnectionString(new ConnectionString(MongoProperties.DEFAULT_URI)); diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizerTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizerTests.java index 71e1c3c533..9e7199ae1e 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizerTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/mongo/MongoPropertiesClientSettingsBuilderCustomizerTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.autoconfigure.mongo; +import java.util.Arrays; import java.util.List; import com.mongodb.MongoClientSettings; @@ -53,6 +54,18 @@ class MongoPropertiesClientSettingsBuilderCustomizerTests { assertServerAddress(allAddresses.get(0), "mongo.example.com", 27017); } + @Test + void additionalHostCanBeAdded() { + this.properties.setHost("mongo.example.com"); + this.properties.setAdditionalHosts(Arrays.asList("mongo.example.com:33", "mongo.example2.com")); + MongoClientSettings settings = customizeSettings(); + List allAddresses = getAllAddresses(settings); + assertThat(allAddresses).hasSize(3); + assertServerAddress(allAddresses.get(0), "mongo.example.com", 27017); + assertServerAddress(allAddresses.get(1), "mongo.example.com", 33); + assertServerAddress(allAddresses.get(2), "mongo.example2.com", 27017); + } + @Test void credentialsCanBeCustomized() { this.properties.setUsername("user"); diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/data/nosql.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/data/nosql.adoc index 0cca88c582..bd7fc8dd59 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/data/nosql.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/data/nosql.adoc @@ -80,7 +80,7 @@ You can set the configprop:spring.data.mongodb.uri[] property to change the URL spring: data: mongodb: - uri: "mongodb://user:secret@mongo1.example.com:12345,mongo2.example.com:23456/test" + uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" ---- Alternatively, you can specify connection details using discrete properties. @@ -91,16 +91,24 @@ For example, you might declare the following settings in your `application.prope spring: data: mongodb: - host: "mongoserver.example.com" + host: "mongoserver1.example.com" port: 27017 + additional-hosts: + - "mongoserver2.example.com:23456" database: "test" username: "user" password: "secret" ---- -TIP: If `spring.data.mongodb.port` is not specified, the default of `27017` is used. +[TIP] +==== +If `spring.data.mongodb.port` is not specified, the default of `27017` is used. You could delete this line from the example shown earlier. +You can also specify the port as part of the host address by using the `host:port` syntax. +This format should be used if you need to change the port of an `additional-hosts` entry. +==== + TIP: If you do not use Spring Data MongoDB, you can inject a `MongoClient` bean instead of using `MongoDatabaseFactory`. If you want to take complete control of establishing the MongoDB connection, you can also declare your own `MongoDatabaseFactory` or `MongoClient` bean.