From 08c42701d9fcf1a42aec9bf1b72ad64679c229a3 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Fri, 5 Sep 2025 09:43:20 +0100 Subject: [PATCH] Rename MongoDB properties that don't require Spring Data MongoDB Previously, all configuration properties for MongoDB used the prefix spring.data.mongodb irrespective of whether or not they required Spring Data MongoDB. This commit renames the properties that do not require Spring Data MongoDB to use the prefix spring.mongodb. Closes gh-34954 --- .../modules/reference/pages/data/nosql.adoc | 44 +++---- .../MyContainersConfiguration.java | 4 +- .../MyContainersConfiguration.kt | 4 +- .../autoconfigure/DataMongoProperties.java | 94 +++++++++++++ .../MongoDataAutoConfiguration.java | 8 +- .../autoconfigure/MongoDataConfiguration.java | 3 +- ...DatabaseFactoryDependentConfiguration.java | 9 +- .../MongoReactiveDataAutoConfiguration.java | 27 ++-- ...itional-spring-configuration-metadata.json | 30 ++--- .../DataMongoPropertiesTests.java | 43 ++++++ .../MongoDataAutoConfigurationTests.java | 22 ++-- ...ngoReactiveDataAutoConfigurationTests.java | 22 ++-- .../autoconfigure/MongoProperties.java | 64 +-------- ...itional-spring-configuration-metadata.json | 124 ++++++++++++++++-- .../MongoAutoConfigurationTests.java | 50 ++++--- .../MongoClientFactorySupportTests.java | 23 ---- .../autoconfigure/MongoPropertiesTests.java | 12 ++ .../MongoReactiveAutoConfigurationTests.java | 51 ++++--- ...ReactiveSessionAutoConfigurationTests.java | 10 +- .../MongoSessionAutoConfigurationTests.java | 2 +- 20 files changed, 397 insertions(+), 249 deletions(-) create mode 100644 module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java create mode 100644 module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java diff --git a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc index 58bb3ee1825..d5ec6fb9a00 100644 --- a/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc +++ b/documentation/spring-boot-docs/src/docs/antora/modules/reference/pages/data/nosql.adoc @@ -130,14 +130,13 @@ Otherwise a javadoc:{url-mongodb-driver-core-javadoc}/com.mongodb.MongoClientSet In either case, you can declare one or more javadoc:org.springframework.boot.autoconfigure.mongo.MongoClientSettingsBuilderCustomizer[] beans to fine-tune the javadoc:{url-mongodb-driver-core-javadoc}/com.mongodb.MongoClientSettings[] configuration. Each will be called in order with the javadoc:{url-mongodb-driver-core-javadoc}/com.mongodb.MongoClientSettings$Builder[] that is used to build the javadoc:{url-mongodb-driver-core-javadoc}/com.mongodb.MongoClientSettings[]. -You can set the configprop:spring.data.mongodb.uri[] property to change the URL and configure additional settings such as the _replica set_, as shown in the following example: +You can set the configprop:spring.mongodb.uri[] property to change the URL and configure additional settings such as the _replica set_, as shown in the following example: [configprops,yaml] ---- spring: - data: - mongodb: - uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" + mongodb: + uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" ---- Alternatively, you can specify connection details using discrete properties. @@ -146,15 +145,14 @@ For example, you might declare the following settings in your `application.prope [configprops,yaml] ---- spring: - data: - mongodb: - host: "mongoserver1.example.com" - port: 27017 - additional-hosts: - - "mongoserver2.example.com:23456" - database: "test" - username: "user" - password: "secret" + mongodb: + host: "mongoserver1.example.com" + port: 27017 + additional-hosts: + - "mongoserver2.example.com:23456" + database: "test" + username: "user" + password: "secret" ---- The auto-configured javadoc:{url-mongodb-driver-sync-javadoc}/com.mongodb.client.MongoClient[] can be configured to use SSL for communication with the server by setting the properties as shown in this example: @@ -162,11 +160,10 @@ The auto-configured javadoc:{url-mongodb-driver-sync-javadoc}/com.mongodb.client [configprops,yaml] ---- spring: - data: - mongodb: - uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" - ssl: - enabled: true + mongodb: + uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" + ssl: + enabled: true ---- Custom SSL trust material can be configured in an xref:features/ssl.adoc[SSL bundle] and applied to the javadoc:{url-mongodb-driver-sync-javadoc}/com.mongodb.client.MongoClient[] as shown in this example: @@ -174,17 +171,16 @@ Custom SSL trust material can be configured in an xref:features/ssl.adoc[SSL bun [configprops,yaml] ---- spring: - data: - mongodb: - uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" - ssl: - bundle: "example" + mongodb: + uri: "mongodb://user:secret@mongoserver1.example.com:27017,mongoserver2.example.com:23456/test" + ssl: + bundle: "example" ---- [TIP] ==== -If `spring.data.mongodb.port` is not specified, the default of `27017` is used. +If configprop:spring.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. diff --git a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.java b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.java index d851836e96a..625cd2c5eee 100644 --- a/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.java +++ b/documentation/spring-boot-docs/src/main/java/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.java @@ -33,8 +33,8 @@ public class MyContainersConfiguration { @Bean public DynamicPropertyRegistrar mongoDbProperties(MongoDBContainer container) { return (properties) -> { - properties.add("spring.data.mongodb.host", container::getHost); - properties.add("spring.data.mongodb.port", container::getFirstMappedPort); + properties.add("spring.mongodb.host", container::getHost); + properties.add("spring.mongodb.port", container::getFirstMappedPort); }; } diff --git a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.kt b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.kt index c74eb3dc780..60a371ab769 100644 --- a/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.kt +++ b/documentation/spring-boot-docs/src/main/kotlin/org/springframework/boot/docs/features/devservices/testcontainers/atdevelopmenttime/dynamicproperties/MyContainersConfiguration.kt @@ -32,8 +32,8 @@ class MyContainersConfiguration { @Bean fun mongoDbProperties(container: MongoDBContainer): DynamicPropertyRegistrar { return DynamicPropertyRegistrar { properties -> - properties.add("spring.data.mongodb.host") { container.host } - properties.add("spring.data.mongodb.port") { container.firstMappedPort } + properties.add("spring.mongodb.host") { container.host } + properties.add("spring.mongodb.port") { container.firstMappedPort } } } diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java new file mode 100644 index 00000000000..a2de313f1d8 --- /dev/null +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoProperties.java @@ -0,0 +1,94 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.data.mongodb.autoconfigure; + +import org.jspecify.annotations.Nullable; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * Configuration properties for Spring Data MongoDB. + * + * @author Andy Wilkinson + * @since 4.0.0 + */ +@ConfigurationProperties("spring.data.mongodb") +public class DataMongoProperties { + + /** + * Whether to enable auto-index creation. + */ + private @Nullable Boolean autoIndexCreation; + + /** + * Fully qualified name of the FieldNamingStrategy to use. + */ + private @Nullable Class fieldNamingStrategy; + + private final Gridfs gridfs = new Gridfs(); + + public @Nullable Boolean isAutoIndexCreation() { + return this.autoIndexCreation; + } + + public void setAutoIndexCreation(@Nullable Boolean autoIndexCreation) { + this.autoIndexCreation = autoIndexCreation; + } + + public @Nullable Class getFieldNamingStrategy() { + return this.fieldNamingStrategy; + } + + public void setFieldNamingStrategy(@Nullable Class fieldNamingStrategy) { + this.fieldNamingStrategy = fieldNamingStrategy; + } + + public Gridfs getGridfs() { + return this.gridfs; + } + + public static class Gridfs { + + /** + * GridFS database name. + */ + private @Nullable String database; + + /** + * GridFS bucket name. + */ + private @Nullable String bucket; + + public @Nullable String getDatabase() { + return this.database; + } + + public void setDatabase(@Nullable String database) { + this.database = database; + } + + public @Nullable String getBucket() { + return this.bucket; + } + + public void setBucket(@Nullable String bucket) { + this.bucket = bucket; + } + + } + +} diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfiguration.java index 90bb976d1fd..a4d68ec14f4 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfiguration.java @@ -35,13 +35,13 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.gridfs.GridFsTemplate; /** - * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's mongo support. + * {@link EnableAutoConfiguration Auto-configuration} for Spring Data's MongoDB support. *

* Registers a {@link MongoTemplate} and {@link GridFsTemplate} beans if no other beans of * the same type are configured. *

- * Honors the {@literal spring.data.mongodb.database} property if set, otherwise connects - * to the {@literal test} database. + * Honors the {@literal spring.mongodb.database} property if set, otherwise connects to + * the {@literal test} database. * * @author Dave Syer * @author Oliver Gierke @@ -54,7 +54,7 @@ import org.springframework.data.mongodb.gridfs.GridFsTemplate; */ @AutoConfiguration(after = MongoAutoConfiguration.class) @ConditionalOnClass({ MongoClient.class, MongoTemplate.class }) -@EnableConfigurationProperties(MongoProperties.class) +@EnableConfigurationProperties({ MongoProperties.class, DataMongoProperties.class }) @Import({ MongoDataConfiguration.class, MongoDatabaseFactoryConfiguration.class, MongoDatabaseFactoryDependentConfiguration.class }) public final class MongoDataAutoConfiguration { diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java index f80c02d1428..a9a43bcfd1f 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataConfiguration.java @@ -23,7 +23,6 @@ import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.domain.EntityScanner; import org.springframework.boot.context.properties.PropertyMapper; -import org.springframework.boot.mongodb.autoconfigure.MongoProperties; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -57,7 +56,7 @@ class MongoDataConfiguration { @Bean @ConditionalOnMissingBean - MongoMappingContext mongoMappingContext(MongoProperties properties, MongoCustomConversions conversions, + MongoMappingContext mongoMappingContext(DataMongoProperties properties, MongoCustomConversions conversions, MongoManagedTypes managedTypes) { PropertyMapper map = PropertyMapper.get().alwaysApplyingWhenNonNull(); MongoMappingContext context = new MongoMappingContext(); diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java index 1e08bdc5913..b09f9040d16 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDatabaseFactoryDependentConfiguration.java @@ -23,8 +23,7 @@ import org.jspecify.annotations.Nullable; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.mongodb.autoconfigure.MongoProperties; -import org.springframework.boot.mongodb.autoconfigure.MongoProperties.Gridfs; +import org.springframework.boot.data.mongodb.autoconfigure.DataMongoProperties.Gridfs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.dao.DataAccessException; @@ -57,7 +56,7 @@ class MongoDatabaseFactoryDependentConfiguration { @Bean @ConditionalOnMissingBean(GridFsOperations.class) - GridFsTemplate gridFsTemplate(MongoProperties properties, MongoDatabaseFactory factory, + GridFsTemplate gridFsTemplate(DataMongoProperties properties, MongoDatabaseFactory factory, MongoTemplate mongoTemplate) { return new GridFsTemplate(new GridFsMongoDatabaseFactory(factory, properties), mongoTemplate.getConverter(), properties.getGridfs().getBucket()); @@ -71,9 +70,9 @@ class MongoDatabaseFactoryDependentConfiguration { private final MongoDatabaseFactory mongoDatabaseFactory; - private final MongoProperties properties; + private final DataMongoProperties properties; - GridFsMongoDatabaseFactory(MongoDatabaseFactory mongoDatabaseFactory, MongoProperties properties) { + GridFsMongoDatabaseFactory(MongoDatabaseFactory mongoDatabaseFactory, DataMongoProperties properties) { Assert.notNull(mongoDatabaseFactory, "'mongoDatabaseFactory' must not be null"); Assert.notNull(properties, "'properties' must not be null"); this.mongoDatabaseFactory = mongoDatabaseFactory; diff --git a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java index cf4952a2e72..bc10620de67 100644 --- a/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java +++ b/module/spring-boot-data-mongodb/src/main/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfiguration.java @@ -33,9 +33,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.data.mongodb.autoconfigure.DataMongoProperties.Gridfs; import org.springframework.boot.mongodb.autoconfigure.MongoConnectionDetails; import org.springframework.boot.mongodb.autoconfigure.MongoProperties; -import org.springframework.boot.mongodb.autoconfigure.MongoProperties.Gridfs; import org.springframework.boot.mongodb.autoconfigure.MongoReactiveAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; @@ -72,21 +72,15 @@ import org.springframework.util.StringUtils; @AutoConfiguration(after = MongoReactiveAutoConfiguration.class) @ConditionalOnClass({ MongoClient.class, ReactiveMongoTemplate.class }) @ConditionalOnBean(MongoClient.class) -@EnableConfigurationProperties(MongoProperties.class) +@EnableConfigurationProperties({ MongoProperties.class, DataMongoProperties.class }) @Import(MongoDataConfiguration.class) public final class MongoReactiveDataAutoConfiguration { - private final MongoProperties properties; - - MongoReactiveDataAutoConfiguration(MongoProperties properties) { - this.properties = properties; - } - @Bean @ConditionalOnMissingBean(ReactiveMongoDatabaseFactory.class) - SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoClient mongo, + SimpleReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory(MongoProperties properties, MongoClient mongo, MongoConnectionDetails connectionDetails) { - String database = this.properties.getDatabase(); + String database = properties.getDatabase(); if (database == null) { database = connectionDetails.getConnectionString().getDatabase(); } @@ -109,11 +103,12 @@ public final class MongoReactiveDataAutoConfiguration { @Bean @ConditionalOnMissingBean(ReactiveGridFsOperations.class) - ReactiveGridFsTemplate reactiveGridFsTemplate(ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory, - MappingMongoConverter mappingMongoConverter, DataBufferFactory dataBufferFactory) { + ReactiveGridFsTemplate reactiveGridFsTemplate(DataMongoProperties dataProperties, + ReactiveMongoDatabaseFactory reactiveMongoDatabaseFactory, MappingMongoConverter mappingMongoConverter, + DataBufferFactory dataBufferFactory) { return new ReactiveGridFsTemplate(dataBufferFactory, - new GridFsReactiveMongoDatabaseFactory(reactiveMongoDatabaseFactory, this.properties), - mappingMongoConverter, this.properties.getGridfs().getBucket()); + new GridFsReactiveMongoDatabaseFactory(reactiveMongoDatabaseFactory, dataProperties), + mappingMongoConverter, dataProperties.getGridfs().getBucket()); } /** @@ -124,9 +119,9 @@ public final class MongoReactiveDataAutoConfiguration { private final ReactiveMongoDatabaseFactory delegate; - private final MongoProperties properties; + private final DataMongoProperties properties; - GridFsReactiveMongoDatabaseFactory(ReactiveMongoDatabaseFactory delegate, MongoProperties properties) { + GridFsReactiveMongoDatabaseFactory(ReactiveMongoDatabaseFactory delegate, DataMongoProperties properties) { this.delegate = delegate; this.properties = properties; } diff --git a/module/spring-boot-data-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/module/spring-boot-data-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json index c6be55b70f7..066dabe99f6 100644 --- a/module/spring-boot-data-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/module/spring-boot-data-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -5,6 +5,20 @@ "type": "java.lang.Boolean", "description": "Whether to enable MongoDB health check.", "defaultValue": true + }, + { + "name": "spring.data.mongodb.grid-fs-database", + "type": "java.lang.String", + "deprecation": { + "replacement": "spring.data.mongodb.gridfs.database", + "level": "error" + } + }, + { + "name": "spring.data.mongodb.repositories.type", + "type": "org.springframework.boot.autoconfigure.data.RepositoryType", + "description": "Type of Mongo repositories to enable.", + "defaultValue": "auto" } ], "hints": [ @@ -18,22 +32,6 @@ } } ] - }, - { - "name": "spring.data.mongodb.protocol", - "values": [ - { - "value": "mongodb" - }, - { - "value": "mongodb+srv" - } - ], - "providers": [ - { - "name": "any" - } - ] } ] } \ No newline at end of file diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java new file mode 100644 index 00000000000..22ca3eb6082 --- /dev/null +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/DataMongoPropertiesTests.java @@ -0,0 +1,43 @@ +/* + * Copyright 2012-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.data.mongodb.autoconfigure; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link DataMongoProperties}. + * + * @author Andy Wilkinson + */ +class DataMongoPropertiesTests { + + @Test + void canBindAutoIndexCreation() { + new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(MongoDataAutoConfiguration.class)) + .withPropertyValues("spring.data.mongodb.auto-index-creation=true") + .run((context) -> { + DataMongoProperties properties = context.getBean(DataMongoProperties.class); + assertThat(properties.isAutoIndexCreation()).isTrue(); + }); + } + +} diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java index fa7d70ab4a0..7f00f0a8938 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoDataAutoConfigurationTests.java @@ -240,7 +240,7 @@ class MongoDataAutoConfigurationTests { @Test void databasePropertyIsUsed() { - this.contextRunner.withPropertyValues("spring.data.mongodb.database=mydb").run((context) -> { + this.contextRunner.withPropertyValues("spring.mongodb.database=mydb").run((context) -> { MongoDatabaseFactory factory = context.getBean(MongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleMongoClientDatabaseFactory.class); assertThat(factory.getMongoDatabase().getName()).isEqualTo("mydb"); @@ -249,19 +249,18 @@ class MongoDataAutoConfigurationTests { @Test void databaseInUriPropertyIsUsed() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/mydb") - .run((context) -> { - MongoDatabaseFactory factory = context.getBean(MongoDatabaseFactory.class); - assertThat(factory).isInstanceOf(SimpleMongoClientDatabaseFactory.class); - assertThat(factory.getMongoDatabase().getName()).isEqualTo("mydb"); - }); + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/mydb").run((context) -> { + MongoDatabaseFactory factory = context.getBean(MongoDatabaseFactory.class); + assertThat(factory).isInstanceOf(SimpleMongoClientDatabaseFactory.class); + assertThat(factory.getMongoDatabase().getName()).isEqualTo("mydb"); + }); } @Test void databasePropertyOverridesUriProperty() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/notused", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/notused", + "spring.mongodb.database=mydb") .run((context) -> { MongoDatabaseFactory factory = context.getBean(MongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleMongoClientDatabaseFactory.class); @@ -272,8 +271,7 @@ class MongoDataAutoConfigurationTests { @Test void databasePropertyIsUsedWhenNoDatabaseInUri() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/", "spring.mongodb.database=mydb") .run((context) -> { MongoDatabaseFactory factory = context.getBean(MongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleMongoClientDatabaseFactory.class); @@ -283,7 +281,7 @@ class MongoDataAutoConfigurationTests { @Test void contextFailsWhenDatabaseNotSet() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/") + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/") .run((context) -> assertThat(context).getFailure().hasMessageContaining("Database name must not be empty")); } diff --git a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java index 8428e89e311..6dcfec7bcd5 100644 --- a/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java +++ b/module/spring-boot-data-mongodb/src/test/java/org/springframework/boot/data/mongodb/autoconfigure/MongoReactiveDataAutoConfigurationTests.java @@ -100,7 +100,7 @@ class MongoReactiveDataAutoConfigurationTests { @Test void databasePropertyIsUsed() { - this.contextRunner.withPropertyValues("spring.data.mongodb.database=mydb").run((context) -> { + this.contextRunner.withPropertyValues("spring.mongodb.database=mydb").run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); @@ -109,19 +109,18 @@ class MongoReactiveDataAutoConfigurationTests { @Test void databaseInUriPropertyIsUsed() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/mydb") - .run((context) -> { - ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); - assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); - assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); - }); + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/mydb").run((context) -> { + ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); + assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); + assertThat(factory.getMongoDatabase().block().getName()).isEqualTo("mydb"); + }); } @Test void databasePropertyOverridesUriProperty() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/notused", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/notused", + "spring.mongodb.database=mydb") .run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); @@ -132,8 +131,7 @@ class MongoReactiveDataAutoConfigurationTests { @Test void databasePropertyIsUsedWhenNoDatabaseInUri() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/", "spring.mongodb.database=mydb") .run((context) -> { ReactiveMongoDatabaseFactory factory = context.getBean(ReactiveMongoDatabaseFactory.class); assertThat(factory).isInstanceOf(SimpleReactiveMongoDatabaseFactory.class); @@ -143,7 +141,7 @@ class MongoReactiveDataAutoConfigurationTests { @Test void contextFailsWhenDatabaseNotSet() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://mongo.example.com/") + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://mongo.example.com/") .run((context) -> assertThat(context).getFailure().hasMessageContaining("Database name must not be empty")); } diff --git a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java index 7da46d5ecef..63704d95e64 100644 --- a/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java +++ b/module/spring-boot-mongodb/src/main/java/org/springframework/boot/mongodb/autoconfigure/MongoProperties.java @@ -39,7 +39,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties; * @author Safeer Ansari * @since 4.0.0 */ -@ConfigurationProperties("spring.data.mongodb") +@ConfigurationProperties("spring.mongodb") public class MongoProperties { /** @@ -89,8 +89,6 @@ public class MongoProperties { */ private @Nullable String authenticationDatabase; - private final Gridfs gridfs = new Gridfs(); - /** * Login user of the mongo server. Ignored if 'uri' is set. */ @@ -106,11 +104,6 @@ public class MongoProperties { */ private @Nullable String replicaSetName; - /** - * Fully qualified name of the FieldNamingStrategy to use. - */ - private @Nullable Class fieldNamingStrategy; - /** * Representation to use when converting a UUID to a BSON binary value. */ @@ -118,11 +111,6 @@ public class MongoProperties { private final Ssl ssl = new Ssl(); - /** - * Whether to enable auto-index creation. - */ - private @Nullable Boolean autoIndexCreation; - public void setProtocol(String protocol) { this.protocol = protocol; } @@ -179,14 +167,6 @@ public class MongoProperties { this.replicaSetName = replicaSetName; } - public @Nullable Class getFieldNamingStrategy() { - return this.fieldNamingStrategy; - } - - public void setFieldNamingStrategy(@Nullable Class fieldNamingStrategy) { - this.fieldNamingStrategy = fieldNamingStrategy; - } - public UuidRepresentation getUuidRepresentation() { return this.uuidRepresentation; } @@ -215,10 +195,6 @@ public class MongoProperties { this.port = port; } - public Gridfs getGridfs() { - return this.gridfs; - } - public @Nullable String getMongoClientDatabase() { if (this.database != null) { return this.database; @@ -226,14 +202,6 @@ public class MongoProperties { return new ConnectionString(determineUri()).getDatabase(); } - public @Nullable Boolean isAutoIndexCreation() { - return this.autoIndexCreation; - } - - public void setAutoIndexCreation(@Nullable Boolean autoIndexCreation) { - this.autoIndexCreation = autoIndexCreation; - } - public @Nullable List getAdditionalHosts() { return this.additionalHosts; } @@ -246,36 +214,6 @@ public class MongoProperties { return this.ssl; } - public static class Gridfs { - - /** - * GridFS database name. - */ - private @Nullable String database; - - /** - * GridFS bucket name. - */ - private @Nullable String bucket; - - public @Nullable String getDatabase() { - return this.database; - } - - public void setDatabase(@Nullable String database) { - this.database = database; - } - - public @Nullable String getBucket() { - return this.bucket; - } - - public void setBucket(@Nullable String bucket) { - this.bucket = bucket; - } - - } - public static class Ssl { /** diff --git a/module/spring-boot-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/module/spring-boot-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 17ab049e80b..10a03a61ef8 100644 --- a/module/spring-boot-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/module/spring-boot-mongodb/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -12,22 +12,130 @@ "defaultValue": true }, { - "name": "spring.data.mongodb.grid-fs-database", - "type": "java.lang.String", + "name": "spring.data.mongodb.additional-hosts", "deprecation": { - "replacement": "spring.data.mongodb.gridfs.database", - "level": "error" + "level": "error", + "replacement": "spring.mongodb.additional-hosts", + "since": "4.0.0" } }, { - "name": "spring.data.mongodb.repositories.type", - "type": "org.springframework.boot.autoconfigure.data.RepositoryType", - "description": "Type of Mongo repositories to enable.", - "defaultValue": "auto" + "name": "spring.data.mongodb.authentication-database", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.authentication-database", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.database", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.database", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.host", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.host", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.password", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.password", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.port", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.port", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.protocol", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.protocol", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.replica-set-name", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.replica-set-name", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.ssl.bundle", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.ssl.bundle", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.ssl.enabled", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.ssl.enabled", + "since": "4.0.0" + } }, { "name": "spring.data.mongodb.uri", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.uri", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.username", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.username", + "since": "4.0.0" + } + }, + { + "name": "spring.data.mongodb.uuid-representation", + "deprecation": { + "level": "error", + "replacement": "spring.mongodb.uuid-representation", + "since": "4.0.0" + } + }, + { + "name": "spring.mongodb.uri", "defaultValue": "mongodb://localhost/test" } + ], + "hints": [ + { + "name": "spring.mongodb.protocol", + "values": [ + { + "value": "mongodb" + }, + { + "value": "mongodb+srv" + } + ], + "providers": [ + { + "name": "any" + } + ] + } ] } diff --git a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoAutoConfigurationTests.java b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoAutoConfigurationTests.java index fccd2ec4604..26f77eb53cd 100644 --- a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoAutoConfigurationTests.java +++ b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoAutoConfigurationTests.java @@ -79,7 +79,7 @@ class MongoAutoConfigurationTests { @Test void configuresSslWhenEnabled() { - this.contextRunner.withPropertyValues("spring.data.mongodb.ssl.enabled=true").run((context) -> { + this.contextRunner.withPropertyValues("spring.mongodb.ssl.enabled=true").run((context) -> { SslSettings sslSettings = getSettings(context).getSslSettings(); assertThat(sslSettings.isEnabled()).isTrue(); assertThat(sslSettings.getContext()).isNotNull(); @@ -90,7 +90,7 @@ class MongoAutoConfigurationTests { @WithPackageResources("test.jks") void configuresSslWithBundle() { this.contextRunner - .withPropertyValues("spring.data.mongodb.ssl.bundle=test-bundle", + .withPropertyValues("spring.mongodb.ssl.bundle=test-bundle", "spring.ssl.bundle.jks.test-bundle.keystore.location=classpath:test.jks", "spring.ssl.bundle.jks.test-bundle.keystore.password=secret", "spring.ssl.bundle.jks.test-bundle.key.password=password") @@ -103,7 +103,7 @@ class MongoAutoConfigurationTests { @Test void configuresProtocol() { - this.contextRunner.withPropertyValues("spring.data.mongodb.protocol=mongodb+srv").run((context) -> { + this.contextRunner.withPropertyValues("spring.mongodb.protocol=mongodb+srv").run((context) -> { MongoClientSettings settings = getSettings(context); assertThat(settings.getClusterSettings().getMode()).isEqualTo(ClusterConnectionMode.MULTIPLE); }); @@ -120,7 +120,7 @@ class MongoAutoConfigurationTests { @Test void configuresWithoutSslWhenDisabledWithBundle() { this.contextRunner - .withPropertyValues("spring.data.mongodb.ssl.enabled=false", "spring.data.mongodb.ssl.bundle=test-bundle") + .withPropertyValues("spring.mongodb.ssl.enabled=false", "spring.mongodb.ssl.bundle=test-bundle") .run((context) -> { SslSettings sslSettings = getSettings(context).getSslSettings(); assertThat(sslSettings.isEnabled()).isFalse(); @@ -130,15 +130,13 @@ class MongoAutoConfigurationTests { @Test void doesNotConfigureCredentialsWithoutUsername() { this.contextRunner - .withPropertyValues("spring.data.mongodb.password=secret", - "spring.data.mongodb.authentication-database=authdb") + .withPropertyValues("spring.mongodb.password=secret", "spring.mongodb.authentication-database=authdb") .run((context) -> assertThat(getSettings(context).getCredential()).isNull()); } @Test void configuresCredentialsFromPropertiesWithDefaultDatabase() { - this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret") + this.contextRunner.withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -150,8 +148,8 @@ class MongoAutoConfigurationTests { @Test void configuresCredentialsFromPropertiesWithDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret", + "spring.mongodb.database=mydb") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -163,8 +161,8 @@ class MongoAutoConfigurationTests { @Test void configuresCredentialsFromPropertiesWithAuthDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret", - "spring.data.mongodb.database=mydb", "spring.data.mongodb.authentication-database=authdb") + .withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret", + "spring.mongodb.database=mydb", "spring.mongodb.authentication-database=authdb") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -175,8 +173,7 @@ class MongoAutoConfigurationTests { @Test void configuresCredentialsFromPropertiesWithSpecialCharacters() { - this.contextRunner - .withPropertyValues("spring.data.mongodb.username=us:er", "spring.data.mongodb.password=sec@ret") + this.contextRunner.withPropertyValues("spring.mongodb.username=us:er", "spring.mongodb.password=sec@ret") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("us:er"); @@ -187,26 +184,25 @@ class MongoAutoConfigurationTests { @Test void doesNotConfigureCredentialsWithoutUsernameInUri() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://localhost/mydb?authSource=authdb") + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://localhost/mydb?authSource=authdb") .run((context) -> assertThat(getSettings(context).getCredential()).isNull()); } @Test void configuresCredentialsFromUriPropertyWithDefaultDatabase() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/") - .run((context) -> { - MongoCredential credential = getSettings(context).getCredential(); - assertThat(credential.getUserName()).isEqualTo("user"); - assertThat(credential.getPassword()).isEqualTo("secret".toCharArray()); - assertThat(credential.getSource()).isEqualTo("admin"); - }); + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/").run((context) -> { + MongoCredential credential = getSettings(context).getCredential(); + assertThat(credential.getUserName()).isEqualTo("user"); + assertThat(credential.getPassword()).isEqualTo("secret".toCharArray()); + assertThat(credential.getSource()).isEqualTo("admin"); + }); } @Test void configuresCredentialsFromUriPropertyWithDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/mydb", - "spring.data.mongodb.database=notused", "spring.data.mongodb.authentication-database=notused") + .withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/mydb", + "spring.mongodb.database=notused", "spring.mongodb.authentication-database=notused") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -218,8 +214,8 @@ class MongoAutoConfigurationTests { @Test void configuresCredentialsFromUriPropertyWithAuthDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/mydb?authSource=authdb", - "spring.data.mongodb.database=notused", "spring.data.mongodb.authentication-database=notused") + .withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/mydb?authSource=authdb", + "spring.mongodb.database=notused", "spring.mongodb.authentication-database=notused") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -236,7 +232,7 @@ class MongoAutoConfigurationTests { @Test void customizerOverridesAutoConfig() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri:mongodb://localhost/test?appname=auto-config") + this.contextRunner.withPropertyValues("spring.mongodb.uri:mongodb://localhost/test?appname=auto-config") .withUserConfiguration(SimpleCustomizerConfig.class) .run((context) -> assertThat(getSettings(context).getApplicationName()).isEqualTo("overridden-name")); } diff --git a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupportTests.java b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupportTests.java index 8bc8a287257..7051bd43ce4 100644 --- a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupportTests.java +++ b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoClientFactorySupportTests.java @@ -24,8 +24,6 @@ import com.mongodb.MongoClientSettings; import org.junit.jupiter.api.Test; import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.test.util.TestPropertyValues; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Configuration; import static org.assertj.core.api.Assertions.assertThat; @@ -47,17 +45,6 @@ import static org.mockito.Mockito.mock; */ abstract class MongoClientFactorySupportTests { - @Test - void canBindCharArrayPassword() { - // gh-1572 - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - TestPropertyValues.of("spring.data.mongodb.password:word").applyTo(context); - context.register(Config.class); - context.refresh(); - MongoProperties properties = context.getBean(MongoProperties.class); - assertThat(properties.getPassword()).isEqualTo("word".toCharArray()); - } - @Test void allMongoClientSettingsCanBeSet() { MongoClientSettings.Builder builder = MongoClientSettings.builder(); @@ -101,16 +88,6 @@ abstract class MongoClientFactorySupportTests { then(customizer).should().customize(any(MongoClientSettings.Builder.class)); } - @Test - void canBindAutoIndexCreation() { - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - TestPropertyValues.of("spring.data.mongodb.autoIndexCreation:true").applyTo(context); - context.register(Config.class); - context.refresh(); - MongoProperties properties = context.getBean(MongoProperties.class); - assertThat(properties.isAutoIndexCreation()).isTrue(); - } - protected T createMongoClient(MongoClientSettings settings) { return createMongoClient(null, settings); } diff --git a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoPropertiesTests.java b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoPropertiesTests.java index e974de29e8b..bdf2d9990ee 100644 --- a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoPropertiesTests.java +++ b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoPropertiesTests.java @@ -19,6 +19,8 @@ package org.springframework.boot.mongodb.autoconfigure; import org.bson.UuidRepresentation; import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; import org.springframework.data.mongodb.config.MongoConfigurationSupport; import static org.assertj.core.api.Assertions.assertThat; @@ -37,6 +39,16 @@ class MongoPropertiesTests { assertThat(springBootDefault).isEqualTo(springDataDefault); } + @Test + void canBindCharArrayPassword() { + new ApplicationContextRunner().withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class)) + .withPropertyValues("spring.mongodb.password:word") + .run((context) -> { + MongoProperties properties = context.getBean(MongoProperties.class); + assertThat(properties.getPassword()).isEqualTo("word".toCharArray()); + }); + } + private UuidRepresentation springDataDefaultUuidRepresentation() { return new MongoConfigurationSupport() { diff --git a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoReactiveAutoConfigurationTests.java b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoReactiveAutoConfigurationTests.java index e1729faee75..eaae4bd9130 100644 --- a/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoReactiveAutoConfigurationTests.java +++ b/module/spring-boot-mongodb/src/test/java/org/springframework/boot/mongodb/autoconfigure/MongoReactiveAutoConfigurationTests.java @@ -59,7 +59,7 @@ class MongoReactiveAutoConfigurationTests { @Test void settingsAdded() { - this.contextRunner.withPropertyValues("spring.data.mongodb.host:localhost") + this.contextRunner.withPropertyValues("spring.mongodb.host:localhost") .withUserConfiguration(SettingsConfig.class) .run((context) -> assertThat(getSettings(context).getSocketSettings().getReadTimeout(TimeUnit.SECONDS)) .isEqualTo(300)); @@ -67,14 +67,14 @@ class MongoReactiveAutoConfigurationTests { @Test void settingsAddedButNoHost() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri:mongodb://localhost/test") + this.contextRunner.withPropertyValues("spring.mongodb.uri:mongodb://localhost/test") .withUserConfiguration(SettingsConfig.class) .run((context) -> assertThat(getSettings(context).getReadPreference()).isEqualTo(ReadPreference.nearest())); } @Test void settingsSslConfig() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri:mongodb://localhost/test") + this.contextRunner.withPropertyValues("spring.mongodb.uri:mongodb://localhost/test") .withUserConfiguration(SslSettingsConfig.class) .run((context) -> { assertThat(context).hasSingleBean(MongoClient.class); @@ -86,7 +86,7 @@ class MongoReactiveAutoConfigurationTests { @Test void configuresSslWhenEnabled() { - this.contextRunner.withPropertyValues("spring.data.mongodb.ssl.enabled=true").run((context) -> { + this.contextRunner.withPropertyValues("spring.mongodb.ssl.enabled=true").run((context) -> { SslSettings sslSettings = getSettings(context).getSslSettings(); assertThat(sslSettings.isEnabled()).isTrue(); assertThat(sslSettings.getContext()).isNotNull(); @@ -97,7 +97,7 @@ class MongoReactiveAutoConfigurationTests { @WithPackageResources("test.jks") void configuresSslWithBundle() { this.contextRunner - .withPropertyValues("spring.data.mongodb.ssl.bundle=test-bundle", + .withPropertyValues("spring.mongodb.ssl.bundle=test-bundle", "spring.ssl.bundle.jks.test-bundle.keystore.location=classpath:test.jks", "spring.ssl.bundle.jks.test-bundle.keystore.password=secret", "spring.ssl.bundle.jks.test-bundle.key.password=password") @@ -111,7 +111,7 @@ class MongoReactiveAutoConfigurationTests { @Test void configuresWithoutSslWhenDisabledWithBundle() { this.contextRunner - .withPropertyValues("spring.data.mongodb.ssl.enabled=false", "spring.data.mongodb.ssl.bundle=test-bundle") + .withPropertyValues("spring.mongodb.ssl.enabled=false", "spring.mongodb.ssl.bundle=test-bundle") .run((context) -> { SslSettings sslSettings = getSettings(context).getSslSettings(); assertThat(sslSettings.isEnabled()).isFalse(); @@ -121,15 +121,13 @@ class MongoReactiveAutoConfigurationTests { @Test void doesNotConfigureCredentialsWithoutUsername() { this.contextRunner - .withPropertyValues("spring.data.mongodb.password=secret", - "spring.data.mongodb.authentication-database=authdb") + .withPropertyValues("spring.mongodb.password=secret", "spring.mongodb.authentication-database=authdb") .run((context) -> assertThat(getSettings(context).getCredential()).isNull()); } @Test void configuresCredentialsFromPropertiesWithDefaultDatabase() { - this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret") + this.contextRunner.withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -141,8 +139,8 @@ class MongoReactiveAutoConfigurationTests { @Test void configuresCredentialsFromPropertiesWithDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret", - "spring.data.mongodb.database=mydb") + .withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret", + "spring.mongodb.database=mydb") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -154,8 +152,8 @@ class MongoReactiveAutoConfigurationTests { @Test void configuresCredentialsFromPropertiesWithAuthDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.username=user", "spring.data.mongodb.password=secret", - "spring.data.mongodb.database=mydb", "spring.data.mongodb.authentication-database=authdb") + .withPropertyValues("spring.mongodb.username=user", "spring.mongodb.password=secret", + "spring.mongodb.database=mydb", "spring.mongodb.authentication-database=authdb") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -166,26 +164,25 @@ class MongoReactiveAutoConfigurationTests { @Test void doesNotConfigureCredentialsWithoutUsernameInUri() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://localhost/mydb?authSource=authdb") + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://localhost/mydb?authSource=authdb") .run((context) -> assertThat(getSettings(context).getCredential()).isNull()); } @Test void configuresCredentialsFromUriPropertyWithDefaultDatabase() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/") - .run((context) -> { - MongoCredential credential = getSettings(context).getCredential(); - assertThat(credential.getUserName()).isEqualTo("user"); - assertThat(credential.getPassword()).isEqualTo("secret".toCharArray()); - assertThat(credential.getSource()).isEqualTo("admin"); - }); + this.contextRunner.withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/").run((context) -> { + MongoCredential credential = getSettings(context).getCredential(); + assertThat(credential.getUserName()).isEqualTo("user"); + assertThat(credential.getPassword()).isEqualTo("secret".toCharArray()); + assertThat(credential.getSource()).isEqualTo("admin"); + }); } @Test void configuresCredentialsFromUriPropertyWithDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/mydb", - "spring.data.mongodb.database=notused", "spring.data.mongodb.authentication-database=notused") + .withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/mydb", + "spring.mongodb.database=notused", "spring.mongodb.authentication-database=notused") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -197,8 +194,8 @@ class MongoReactiveAutoConfigurationTests { @Test void configuresCredentialsFromUriPropertyWithAuthDatabase() { this.contextRunner - .withPropertyValues("spring.data.mongodb.uri=mongodb://user:secret@localhost/mydb?authSource=authdb", - "spring.data.mongodb.database=notused", "spring.data.mongodb.authentication-database=notused") + .withPropertyValues("spring.mongodb.uri=mongodb://user:secret@localhost/mydb?authSource=authdb", + "spring.mongodb.database=notused", "spring.mongodb.authentication-database=notused") .run((context) -> { MongoCredential credential = getSettings(context).getCredential(); assertThat(credential.getUserName()).isEqualTo("user"); @@ -224,7 +221,7 @@ class MongoReactiveAutoConfigurationTests { @Test @SuppressWarnings("deprecation") void customizerWithTransportSettingsOverridesAutoConfig() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri:mongodb://localhost/test?appname=auto-config") + this.contextRunner.withPropertyValues("spring.mongodb.uri:mongodb://localhost/test?appname=auto-config") .withUserConfiguration(SimpleTransportSettingsCustomizerConfig.class) .run((context) -> { assertThat(context).hasSingleBean(MongoClient.class); diff --git a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoReactiveSessionAutoConfigurationTests.java b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoReactiveSessionAutoConfigurationTests.java index 2c33a2b65a8..f60cb1f79bf 100644 --- a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoReactiveSessionAutoConfigurationTests.java +++ b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoReactiveSessionAutoConfigurationTests.java @@ -62,14 +62,14 @@ class MongoReactiveSessionAutoConfigurationTests extends AbstractReactiveSession @Test void defaultConfig() { - this.contextRunner.withPropertyValues("spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + this.contextRunner.withPropertyValues("spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run(validateSpringSessionUsesMongo("sessions")); } @Test void defaultConfigWithCustomTimeout() { this.contextRunner - .withPropertyValues("spring.session.timeout=1m", "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + .withPropertyValues("spring.session.timeout=1m", "spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run((context) -> { ReactiveMongoSessionRepository repository = validateSessionRepository(context, ReactiveMongoSessionRepository.class); @@ -81,7 +81,7 @@ class MongoReactiveSessionAutoConfigurationTests extends AbstractReactiveSession void defaultConfigWithCustomSessionTimeout() { this.contextRunner .withPropertyValues("server.reactive.session.timeout=1m", - "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + "spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run((context) -> { ReactiveMongoSessionRepository repository = validateSessionRepository(context, ReactiveMongoSessionRepository.class); @@ -93,7 +93,7 @@ class MongoReactiveSessionAutoConfigurationTests extends AbstractReactiveSession void mongoSessionStoreWithCustomizations() { this.contextRunner .withPropertyValues("spring.session.mongodb.collection-name=foo", - "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + "spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run(validateSpringSessionUsesMongo("foo")); } @@ -106,7 +106,7 @@ class MongoReactiveSessionAutoConfigurationTests extends AbstractReactiveSession "server.reactive.session.cookie.path:/example", "server.reactive.session.cookie.max-age:60", "server.reactive.session.cookie.http-only:false", "server.reactive.session.cookie.secure:false", "server.reactive.session.cookie.same-site:strict", - "spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()) + "spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()) .run(assertExchangeWithSession((exchange) -> { List cookies = exchange.getResponse().getCookies().get("JSESSIONID"); assertThat(cookies).isNotEmpty(); diff --git a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoSessionAutoConfigurationTests.java b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoSessionAutoConfigurationTests.java index 9596c02b020..05f8c4f083b 100644 --- a/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoSessionAutoConfigurationTests.java +++ b/module/spring-boot-session-data-mongodb/src/dockerTest/java/org/springframework/boot/session/data/mongodb/autoconfigure/MongoSessionAutoConfigurationTests.java @@ -57,7 +57,7 @@ class MongoSessionAutoConfigurationTests extends AbstractSessionAutoConfiguratio this.contextRunner = new WebApplicationContextRunner() .withConfiguration(AutoConfigurations.of(MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, SessionAutoConfiguration.class, MongoSessionAutoConfiguration.class)) - .withPropertyValues("spring.data.mongodb.uri=" + mongoDb.getReplicaSetUrl()); + .withPropertyValues("spring.mongodb.uri=" + mongoDb.getReplicaSetUrl()); } @Test