32

I am currently writing an application which should use a replica set of MongoDB. It is a Spring Boot based application and the following properties work perfectly fine to connect to one server:

spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=demo

This is absolutely fine for my local dev environment. But later on it should run against a MongoDB replica set, so I have to provide at least 2, better 3 replica set seeds, but how can I do this with properties?

I had a look on this page: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html, but there is no explicit property for replica sets mentioned. Providing a comma separated list of addresses like this:

spring.data.mongodb.host=127.0.0.1,127.0.1.1,127.0.2.1
spring.data.mongodb.uri=mongo://127.0.0.1,mongo://127.0.0.1:27018

(I tried one after another.)

This is also not working (in fact, it produces an exception which lets Spring uses the default configuration).

I also tried to use the following config.xml, with no luck:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mongo="http://www.springframework.org/schema/data/mongo"
          xsi:schemaLocation=
          "http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd
          http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <mongo:mongo id="replicaSetMongo" replica-set="127.0.0.1:27017,localhost:27018"/>

</beans>

I know that the above configs are slightly different, but what I am currently trying is to get an exception which is showing me that no replica set node was reachable.

Any ideas, hints?

1

4 Answers 4

23

There is no explicit support for that, no. But you should be able to configure that just fine via the uri parameter.

We've actually updated the documentation recently.

2
  • Thanks for your answer Stephane. Which version is of Spring Data Mongo is supporting this sort of configuration property? Commented Aug 7, 2015 at 16:38
  • Ok, I finally got some time to check this. It seems to work. But the log messages are not very clear about clusters (hopefully I will find some time to investigate and log an issue) Anyway, thanks for your quick help! Commented Aug 27, 2015 at 8:40
23

I had a similar problem and I dug into the MongoProperties::createMongoClient() code and found that the code was ignoring the uri value if there were any values configured for spring.data.mongodb.host, spring.data.mongodb.port, spring.data.mongodb.username or spring.data.mongodb.password.

If I put all that information in the URI (and removed all the other spring.data.mongodb.* values from the property file), the connection code worked.

The URI property setting ended up looking like this:

mongodb://username:mypasswd@hostname1:27017,hostname2:27017,hostname3:27017/dbname

The docs for formatting your URI value are here.

4
  • Thanks for commenting, I completely forgot to add this. Indeed, if any of the mentioned values is set, the URI is ignored. Commented Jan 7, 2016 at 9:14
  • can you please tell where to add authentication database name in here?
    – Sameesh
    Commented Jun 16, 2020 at 8:30
  • when connecting to a replica set reads by default will be done from primary node unless explicitly specified to read from secondary right?
    – Fernando
    Commented May 13, 2021 at 18:24
  • does the replset option flag has to be specified?. What happens if not specified?
    – Fernando
    Commented May 13, 2021 at 18:26
9

Change application.properties from this:

spring.data.mongodb.host=server1
spring.data.mongodb.port=27017
spring.data.mongodb.authentication-database=system
spring.data.mongodb.database=database

...to this:

spring.data.mongodb.uri=mongodb://username:password@server1:port,server2:port/database
0

additional-hosts property added since spring boot 3.0.0-M5 as per this github issue.

spring:
  data:
    mongodb:
      host: 0.0.0.1
      port: 27017
      additional-hosts: [0.0.0.2:12345, 0.0.0.3]

See description in spring boot common app properties.

Not the answer you're looking for? Browse other questions tagged or ask your own question.