After upgrading to Spring Boot 3.1.0 from 3.0.x mongo auto configuration is not working.
application.properties
spring.data.mongodb.database=demo
spring.data.mongodb.uri=mongodb+srv://user:pwd@example-domain.a5t41.mongodb.net/?retryWrites=true&w=majority
Caused by: java.lang.IllegalArgumentException: Database name must not be empty
at org.springframework.util.Assert.hasText(Assert.java:294) ~[spring-core-6.0.9.jar:6.0.9]
at org.springframework.data.mongodb.core.MongoDatabaseFactorySupport.<init>(MongoDatabaseFactorySupport.java:68) ~[spring-data-mongodb-4.1.0.jar:4.1.0]
at org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory.<init>(SimpleMongoClientDatabaseFactory.java:75) ~[spring-data-mongodb-4.1.0.jar:4.1.0]
at org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory.<init>(SimpleMongoClientDatabaseFactory.java:64) ~[spring-data-mongodb-4.1.0.jar:4.1.0]
at org.springframework.boot.autoconfigure.data.mongo.MongoDatabaseFactoryConfiguration.mongoDatabaseFactory(MongoDatabaseFactoryConfiguration.java:47) ~[spring-boot-autoconfigure-3.1.0.jar:3.1.0]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.9.jar:6.0.9]
Maybe we need to have a fallback option?
// org.springframework.boot.autoconfigure.data.mongo.MongoDatabaseFactoryConfiguration
@Bean
MongoDatabaseFactorySupport<?> mongoDatabaseFactory(MongoClient mongoClient, MongoProperties properties, MongoConnectionDetails connectionDetails) {
// might be null as per documentation @Nullable
String databaseName = connectionDetails.getConnectionString().getDatabase();
if (databaseName == null) {
databaseName = properties.getDatabase();
}
return new SimpleMongoClientDatabaseFactory(mongoClient, databaseName);
}
Comment From: scottfrederick
@burl21 Did setting spring.data.mongodb.database and spring.data.mongodb.uri like this work for you with previous versions of Spring Boot? If so, I don't think it was intended to. From the description of spring.data.mongodb.uri:
Mongo database URI. Overrides host, port, username, password, and database.
The intent is that you can either set host, port, username, password, database etc as discrete fields or you can provide only the URL that contains all these fields. Is there a reason you can't provide the database name as part of the URI?
Comment From: burl21
@scottfrederick In Spring Boot v3.0.7 it works with these properties
spring.data.mongodb.database=demo
spring.data.mongodb.uri=mongodb+srv://user:pwd@example-domain.a5t41.mongodb.net/?retryWrites=true&w=majority
There is no problem setting the database name, the connection string is taken from mongoDB Atlas, so I copied and pasted.
I understood the mistake. Thank you for your reply.