From 29f05af733ee97f5abbb319a3f8a23255c9c6717 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 24 Mar 2020 07:50:44 +0100 Subject: [PATCH] DATAMONGO-2477 - Disable auto index creation by default. Original pull request: #845. --- .../config/MappingMongoConverterParser.java | 10 ++++ .../config/MongoConfigurationSupport.java | 6 +-- .../core/mapping/MongoMappingContext.java | 7 +-- .../data/mongodb/config/spring-mongo-3.0.xsd | 10 ++++ .../config/AbstractIntegrationTests.java | 5 ++ .../mongodb/core/MongoTemplateUnitTests.java | 1 + .../core/ReactiveMongoTemplateIndexTests.java | 8 ++- .../core/index/IndexingIntegrationTests.java | 5 ++ .../core/mapping/GeoIndexedAppConfig.java | 5 ++ .../mongodb/core/mapping/MappingTests.java | 14 +++++- .../ReactiveMongoRepositoryTests.java | 5 ++ ...MongoNamespaceIntegrationTests-context.xml | 2 + src/main/asciidoc/reference/mapping.adoc | 6 +-- src/main/asciidoc/upgrading.adoc | 50 ++++++++++++++++++- 14 files changed, 120 insertions(+), 14 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java index adbf2e771..767c03e3a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MappingMongoConverterParser.java @@ -96,6 +96,9 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { String id = element.getAttribute(AbstractBeanDefinitionParser.ID_ATTRIBUTE); id = StringUtils.hasText(id) ? id : DEFAULT_CONVERTER_BEAN_NAME; + String autoIndexCreation = element.getAttribute("auto-index-creation"); + boolean autoIndexCreationEnabled = StringUtils.hasText(autoIndexCreation) && Boolean.valueOf(autoIndexCreation); + parserContext.pushContainingComponent(new CompositeComponentDefinition("Mapping Mongo Converter", element)); BeanDefinition conversionsDefinition = getCustomConversions(element, parserContext); @@ -199,6 +202,11 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { public static String potentiallyCreateMappingContext(Element element, ParserContext parserContext, @Nullable BeanDefinition conversionsDefinition, @Nullable String converterId) { + return potentiallyCreateMappingContext(element, parserContext, conversionsDefinition, converterId, false); + } + + public static String potentiallyCreateMappingContext(Element element, ParserContext parserContext, + @Nullable BeanDefinition conversionsDefinition, @Nullable String converterId, boolean autoIndexCreation) { String ctxRef = element.getAttribute("mapping-context-ref"); @@ -226,6 +234,8 @@ public class MappingMongoConverterParser implements BeanDefinitionParser { mappingContextBuilder.addPropertyValue("simpleTypeHolder", simpleTypesDefinition); } + mappingContextBuilder.addPropertyValue("autoIndexCreation", autoIndexCreation); + parseFieldNamingStrategy(element, parserContext.getReaderContext(), mappingContextBuilder); ctxRef = converterId == null || DEFAULT_CONVERTER_BEAN_NAME.equals(converterId) ? MAPPING_CONTEXT_BEAN_NAME diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java index efef317d8..41870bdca 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/config/MongoConfigurationSupport.java @@ -199,12 +199,12 @@ public abstract class MongoConfigurationSupport { * Configure whether to automatically create indices for domain types by deriving the * {@link org.springframework.data.mongodb.core.index.IndexDefinition} from the entity or not. * - * @return {@literal true} by default.
- * INFO: As of 3.x the default will be set to {@literal false}. + * @return {@literal false} by default.
+ * INFO: As of 3.x the default will is set to {@literal false} was {@literal true} in 2.x. * @since 2.2 */ protected boolean autoIndexCreation() { - return true; + return false; } /** diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java index b55fb3cfa..170ba47d7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/MongoMappingContext.java @@ -43,7 +43,7 @@ public class MongoMappingContext extends AbstractMappingContextNOTE:Index creation should happen at a well-defined time that is ideally controlled by the * application itself. * - * @return {@literal true} when auto-index creation is enabled; {@literal false} otherwise. + * @return {@literal true} when auto-index creation is enabled; {@literal false} otherwise.
+ * INFO: As of 3.x the default will is set to {@literal false} was {@literal true} in 2.x. * @since 2.2 * @see org.springframework.data.mongodb.core.index.Indexed */ @@ -121,7 +122,7 @@ public class MongoMappingContext extends AbstractMappingContextNOTE:Index creation should happen at a well-defined time that is ideally controlled by the * application itself. * - * @param autoCreateIndexes set to {@literal false} to disable auto-index creation. + * @param autoCreateIndexes set to {@literal true} to enable auto-index creation. * @since 2.2 * @see org.springframework.data.mongodb.core.index.Indexed */ diff --git a/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-3.0.xsd b/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-3.0.xsd index e670b66cd..8a6f39bb7 100644 --- a/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-3.0.xsd +++ b/spring-data-mongodb/src/main/resources/org/springframework/data/mongodb/config/spring-mongo-3.0.xsd @@ -224,6 +224,16 @@ The base package in which to scan for entities annotated with @Document + + + + Enable/Disable index creation for annotated properties/entities. + + + + + + diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java index 29b24dd5c..fe75ae5a6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/config/AbstractIntegrationTests.java @@ -62,6 +62,11 @@ public abstract class AbstractIntegrationTests { protected Set> getInitialEntitySet() throws ClassNotFoundException { return Collections.emptySet(); } + + @Override + protected boolean autoIndexCreation() { + return true; + } } @Autowired MongoOperations operations; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index 44dfead8b..da6a16c6a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -206,6 +206,7 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { when(distinctIterable.into(any())).thenReturn(Collections.emptyList()); this.mappingContext = new MongoMappingContext(); + mappingContext.setAutoIndexCreation(true); mappingContext.afterPropertiesSet(); this.converter = spy(new MappingMongoConverter(new DefaultDbRefResolver(factory), mappingContext)); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateIndexTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateIndexTests.java index b1f678bda..07757dc25 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateIndexTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/ReactiveMongoTemplateIndexTests.java @@ -19,6 +19,9 @@ import static org.assertj.core.data.Index.atIndex; import static org.springframework.data.mongodb.test.util.Assertions.*; import lombok.Data; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; +import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import reactor.core.publisher.Flux; import reactor.test.StepVerifier; @@ -66,7 +69,10 @@ public class ReactiveMongoTemplateIndexTests { void setUp() { factory = new SimpleReactiveMongoDatabaseFactory(client, "reactive-template-index-tests"); - template = new ReactiveMongoTemplate(factory); + MongoMappingContext mappingContext = new MongoMappingContext(); + mappingContext.setAutoIndexCreation(true); + template = new ReactiveMongoTemplate(factory, new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)); + MongoTestUtils.dropCollectionNow(template.getMongoDatabase().getName(), "person", client); MongoTestUtils.dropCollectionNow(template.getMongoDatabase().getName(), "indexfail", client); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/IndexingIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/IndexingIntegrationTests.java index acfab7bfb..fb269c0c1 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/IndexingIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/index/IndexingIntegrationTests.java @@ -95,6 +95,11 @@ public class IndexingIntegrationTests { protected Set> getInitialEntitySet() throws ClassNotFoundException { return Collections.emptySet(); } + + @Override + protected boolean autoIndexCreation() { + return true; + } } @AfterEach diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedAppConfig.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedAppConfig.java index 966f14684..63667b41c 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedAppConfig.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/GeoIndexedAppConfig.java @@ -55,4 +55,9 @@ public class GeoIndexedAppConfig extends AbstractMongoClientConfiguration { protected Set> getInitialEntitySet() throws ClassNotFoundException { return Collections.emptySet(); } + + @Override + protected boolean autoIndexCreation() { + return true; + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/MappingTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/MappingTests.java index f6addcd40..153e653f2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/MappingTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/MappingTests.java @@ -40,6 +40,9 @@ import org.springframework.data.domain.Sort.Direction; import org.springframework.data.mongodb.MongoCollectionUtils; import org.springframework.data.mongodb.core.CollectionCallback; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; +import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.NoOpDbRefResolver; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.test.util.Client; @@ -186,7 +189,10 @@ public class MappingTests { @SuppressWarnings({ "unchecked", "rawtypes" }) public void testUniqueIndex() { - MongoTemplate template = new MongoTemplate(client, DB_NAME); + MongoMappingContext mappingContext = new MongoMappingContext(); + mappingContext.setAutoIndexCreation(true); + + MongoTemplate template = new MongoTemplate(new SimpleMongoClientDatabaseFactory(client, DB_NAME), new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)); Address addr = new Address(); addr.setLines(new String[] { "1234 W. 1st Street", "Apt. 12" }); @@ -227,7 +233,11 @@ public class MappingTests { @Test public void testIndexesCreatedInRightCollection() { - MongoTemplate template = new MongoTemplate(client, DB_NAME); + MongoMappingContext mappingContext = new MongoMappingContext(); + mappingContext.setAutoIndexCreation(true); + + MongoTemplate template = new MongoTemplate(new SimpleMongoClientDatabaseFactory(client, DB_NAME), new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, mappingContext)); + CustomCollectionWithIndex ccwi = new CustomCollectionWithIndex("test"); template.insert(ccwi); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java index 9c08e352b..ef388005e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java @@ -131,6 +131,11 @@ public class ReactiveMongoRepositoryTests { ReactiveCappedCollectionRepository reactiveCappedCollectionRepository(ReactiveMongoRepositoryFactory factory) { return factory.getRepository(ReactiveCappedCollectionRepository.class); } + + @Override + protected boolean autoIndexCreation() { + return true; + } } @BeforeAll diff --git a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml index 839d6b2f4..f335c637f 100644 --- a/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml +++ b/spring-data-mongodb/src/test/resources/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests-context.xml @@ -18,6 +18,8 @@ + + diff --git a/src/main/asciidoc/reference/mapping.adoc b/src/main/asciidoc/reference/mapping.adoc index d0bcf96dc..eb690a34d 100644 --- a/src/main/asciidoc/reference/mapping.adoc +++ b/src/main/asciidoc/reference/mapping.adoc @@ -392,7 +392,7 @@ Automatic index creation is only done for types annotated with `@Document`. [NOTE] ==== -To turn automatic index creation _OFF_ please override `autoIndexCreation()` in your configuration. +To turn automatic index creation _ON_ please override `autoIndexCreation()` in your configuration. [source,java] ---- @Configuration @@ -400,7 +400,7 @@ public class Config extends AbstractMongoClientConfiguration { @Override public boolean autoIndexCreation() { - return false; + return true; } // ... @@ -408,7 +408,7 @@ public class Config extends AbstractMongoClientConfiguration { ---- ==== -IMPORTANT: Automatic index creation will be turned _OFF_ by default with the release of 3.x. +IMPORTANT: Automatic index creation is turned _OFF_ by default as of the release of 3.x. We recommend index creation to happen either out of band or as part of the application startup using `IndexOperations`. diff --git a/src/main/asciidoc/upgrading.adoc b/src/main/asciidoc/upgrading.adoc index d2111515b..f695e0d06 100644 --- a/src/main/asciidoc/upgrading.adoc +++ b/src/main/asciidoc/upgrading.adoc @@ -148,6 +148,52 @@ Element | Comment == Other Changes +=== Auto Index Creation + +Annotation based index creation is now turned **OFF** by default and needs to be enabled eg. when relying on `@GeoSpatialIndexed`. + +.Enable Auto Index Creation +==== + +.XML Namespace +[source,xml] +---- + <1> +---- + +.Java Config +[source,java] +---- +@Configuration +public class Config extends AbstractMongoClientConfiguration { + + @Override + protected boolean autoIndexCreation() { <2> + return true; + } + + // ... +} +---- + +.Programmatic +[source,java] +---- +MongoDatabaseFactory dbFactory = new SimpleMongoClientDatabaseFactory(...); +DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(dbFactory); + +MongoMappingContext mappingContext = new MongoMappingContext(); +mappingContext.setAutoIndexCreation(true); <3> +// ... +mappingContext.afterPropertiesSet(); + +MongoTemplate template = new MongoTemplate(dbFactory, new MappingMongoConverter(dbRefResolver, mappingContext)); +---- +<1> Use the XML namespace attribute `auto-index-creation` on `mapping-converter`. +<2> Overrride `autoIndexCreation` via `AbstractMongoClientConfiguration` or `AbstractReactiveMongoClientConfiguration`. +<3> Set the flag on `MongoMappingContext`. +==== + === UUID Types The MongoDB UUID representation can now be configured with different formats. @@ -157,8 +203,8 @@ This has to be done via `MongoClientSettings` as shown in the snippet below. ==== [source,java] ---- - -static class Config extends AbstractMongoClientConfiguration { +@Configuration +public class Config extends AbstractMongoClientConfiguration { @Override public void configureClientSettings(MongoClientSettings.Builder builder) {