diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefProxyHandler.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefProxyHandler.java index 21e1bab2b..0f711ff25 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefProxyHandler.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefProxyHandler.java @@ -21,7 +21,6 @@ import org.bson.Document; import org.springframework.data.mapping.PersistentPropertyAccessor; import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.mapping.model.SpELContext; import org.springframework.data.mapping.model.ValueExpressionEvaluator; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.data.mongodb.core.mapping.MongoPersistentProperty; @@ -36,21 +35,17 @@ import com.mongodb.DBRef; */ class DefaultDbRefProxyHandler implements DbRefProxyHandler { - private final SpELContext spELContext; private final MappingContext, MongoPersistentProperty> mappingContext; private final ValueResolver resolver; private final Function evaluatorFactory; /** - * @param spELContext must not be {@literal null}. * @param mappingContext must not be {@literal null}. * @param resolver must not be {@literal null}. */ - public DefaultDbRefProxyHandler(SpELContext spELContext, - MappingContext, MongoPersistentProperty> mappingContext, + public DefaultDbRefProxyHandler(MappingContext, MongoPersistentProperty> mappingContext, ValueResolver resolver, Function evaluatorFactory) { - this.spELContext = spELContext; this.mappingContext = mappingContext; this.resolver = resolver; this.evaluatorFactory = evaluatorFactory; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolverCallback.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolverCallback.java index 0e9083571..281d00db8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolverCallback.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolverCallback.java @@ -43,7 +43,7 @@ class DefaultDbRefResolverCallback implements DbRefResolverCallback { * @param evaluator must not be {@literal null}. * @param resolver must not be {@literal null}. */ - public DefaultDbRefResolverCallback(Bson surroundingObject, ObjectPath path, ValueExpressionEvaluator evaluator, + DefaultDbRefResolverCallback(Bson surroundingObject, ObjectPath path, ValueExpressionEvaluator evaluator, ValueResolver resolver) { this.surroundingObject = surroundingObject; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 9f0bc4c10..4e38ab25c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -176,7 +176,7 @@ public class MappingMongoConverter extends AbstractMongoConverter this.idMapper = new QueryMapper(this); this.spELContext = new SpELContext(DocumentPropertyAccessor.INSTANCE); - this.dbRefProxyHandler = new DefaultDbRefProxyHandler(spELContext, mappingContext, + this.dbRefProxyHandler = new DefaultDbRefProxyHandler(mappingContext, (prop, bson, evaluator, path) -> { ConversionContext context = getConversionContext(path); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java index 9759e374f..2639153e5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/EvaluationContextExpressionEvaluator.java @@ -34,7 +34,7 @@ class EvaluationContextExpressionEvaluator implements ValueExpressionEvaluator { final ValueProvider valueProvider; final ExpressionParser expressionParser; - public EvaluationContextExpressionEvaluator(ValueProvider valueProvider, ExpressionParser expressionParser) { + EvaluationContextExpressionEvaluator(ValueProvider valueProvider, ExpressionParser expressionParser) { this.valueProvider = valueProvider; this.expressionParser = expressionParser; @@ -46,16 +46,16 @@ class EvaluationContextExpressionEvaluator implements ValueExpressionEvaluator { return evaluateExpression(expression, Collections.emptyMap()); } - public EvaluationContext getEvaluationContext(String expressionString) { + EvaluationContext getEvaluationContext(String expressionString) { return new StandardEvaluationContext(); } - public Expression getParsedExpression(String expressionString) { + Expression getParsedExpression(String expressionString) { return expressionParser.parseExpression(expressionString); } @SuppressWarnings("unchecked") - public T evaluateExpression(String expressionString, Map variables) { + T evaluateExpression(String expressionString, Map variables) { Expression expression = getParsedExpression(expressionString); EvaluationContext ctx = getEvaluationContext(expressionString); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java index f07a26676..dcedba84e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/BasicMongoPersistentEntityUnitTests.java @@ -28,16 +28,18 @@ import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.junitpioneer.jupiter.SetSystemProperty; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.context.ApplicationContext; import org.springframework.core.annotation.AliasFor; +import org.springframework.core.env.StandardEnvironment; import org.springframework.data.mapping.MappingException; import org.springframework.data.mongodb.core.query.Collation; import org.springframework.data.spel.ExtensionAwareEvaluationContextProvider; import org.springframework.data.spel.spi.EvaluationContextExtension; -import org.springframework.data.util.ClassTypeInformation; +import org.springframework.data.util.TypeInformation; /** * Unit tests for {@link BasicMongoPersistentEntity}. @@ -56,14 +58,14 @@ public class BasicMongoPersistentEntityUnitTests { void subclassInheritsAtDocumentAnnotation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(Person.class)); + TypeInformation.of(Person.class)); assertThat(entity.getCollection()).isEqualTo("contacts"); } @Test void evaluatesSpELExpression() { - MongoPersistentEntity entity = new BasicMongoPersistentEntity<>(ClassTypeInformation.from(Company.class)); + MongoPersistentEntity entity = new BasicMongoPersistentEntity<>(TypeInformation.of(Company.class)); assertThat(entity.getCollection()).isEqualTo("35"); } @@ -76,7 +78,7 @@ public class BasicMongoPersistentEntityUnitTests { when(context.getBean("myBean")).thenReturn(provider); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(DynamicallyMapped.class)); + TypeInformation.of(DynamicallyMapped.class)); entity.setEvaluationContextProvider(new ExtensionAwareEvaluationContextProvider(context)); assertThat(entity.getCollection()).isEqualTo("reference"); @@ -89,7 +91,7 @@ public class BasicMongoPersistentEntityUnitTests { void shouldDetectLanguageCorrectly() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(DocumentWithLanguage.class)); + TypeInformation.of(DocumentWithLanguage.class)); assertThat(entity.getLanguage()).isEqualTo("spanish"); } @@ -101,7 +103,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(Number.class).when(propertyMock).getActualType(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); assertThatExceptionOfType(MappingException.class).isThrownBy(entity::verify); @@ -114,7 +116,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(String.class).when(propertyMock).getActualType(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); entity.verify(); @@ -127,7 +129,7 @@ public class BasicMongoPersistentEntityUnitTests { void verifyShouldIgnoreNonExplicitLanguageProperty() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); when(propertyMock.isExplicitLanguageProperty()).thenReturn(false); entity.addPersistentProperty(propertyMock); @@ -149,7 +151,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(true).when(dbRefMock).lazy(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); assertThatExceptionOfType(MappingException.class).isThrownBy(entity::verify); @@ -167,7 +169,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(true).when(dbRefMock).lazy(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); assertThatExceptionOfType(MappingException.class).isThrownBy(entity::verify); @@ -185,7 +187,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(true).when(dbRefMock).lazy(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); entity.verify(); @@ -203,7 +205,7 @@ public class BasicMongoPersistentEntityUnitTests { doReturn(false).when(dbRefMock).lazy(); BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(AnyDocument.class)); + TypeInformation.of(AnyDocument.class)); entity.addPersistentProperty(propertyMock); entity.verify(); @@ -214,7 +216,7 @@ public class BasicMongoPersistentEntityUnitTests { void metaInformationShouldBeReadCorrectlyFromInheritedDocumentAnnotation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(DocumentWithCustomAnnotation.class)); + TypeInformation.of(DocumentWithCustomAnnotation.class)); assertThat(entity.getCollection()).isEqualTo("collection-1"); } @@ -223,7 +225,7 @@ public class BasicMongoPersistentEntityUnitTests { void metaInformationShouldBeReadCorrectlyFromComposedDocumentAnnotation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(DocumentWithComposedAnnotation.class)); + TypeInformation.of(DocumentWithComposedAnnotation.class)); assertThat(entity.getCollection()).isEqualTo("custom-collection"); } @@ -232,18 +234,29 @@ public class BasicMongoPersistentEntityUnitTests { void usesEvaluationContextExtensionInDynamicDocumentName() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(MappedWithExtension.class)); + TypeInformation.of(MappedWithExtension.class)); entity.setEvaluationContextProvider( new ExtensionAwareEvaluationContextProvider(Collections.singletonList(new SampleExtension()))); assertThat(entity.getCollection()).isEqualTo("collectionName"); } + @Test // GH-4634 + @SetSystemProperty(key = "mongo.entity.collection", value = "collectionName") + void readsCollectionNameFromSystemProperty() { + + BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( + TypeInformation.of(MappedWithExtensionPropertyPlaceholderStyle.class)); + entity.setEnvironment(new StandardEnvironment()); + + assertThat(entity.getCollection()).isEqualTo("collectionName"); + } + @Test // DATAMONGO-1854 void readsSimpleCollation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(WithSimpleCollation.class)); + TypeInformation.of(WithSimpleCollation.class)); assertThat(entity.getCollation()).isEqualTo(org.springframework.data.mongodb.core.query.Collation.of("en_US")); } @@ -252,7 +265,7 @@ public class BasicMongoPersistentEntityUnitTests { void readsDocumentCollation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(WithDocumentCollation.class)); + TypeInformation.of(WithDocumentCollation.class)); assertThat(entity.getCollation()).isEqualTo(org.springframework.data.mongodb.core.query.Collation.of("en_US")); } @@ -261,7 +274,7 @@ public class BasicMongoPersistentEntityUnitTests { void usesCorrectExpressionsForCollectionAndCollation() { BasicMongoPersistentEntity entity = new BasicMongoPersistentEntity<>( - ClassTypeInformation.from(WithCollectionAndCollationFromSpEL.class)); + TypeInformation.of(WithCollectionAndCollationFromSpEL.class)); entity.setEvaluationContextProvider( new ExtensionAwareEvaluationContextProvider(Collections.singletonList(new SampleExtension()))); @@ -298,7 +311,7 @@ public class BasicMongoPersistentEntityUnitTests { } static BasicMongoPersistentEntity entityOf(Class type) { - return new BasicMongoPersistentEntity<>(ClassTypeInformation.from(type)); + return new BasicMongoPersistentEntity<>(TypeInformation.of(type)); } @Document("contacts") @@ -350,6 +363,9 @@ public class BasicMongoPersistentEntityUnitTests { @Document("#{myProperty}") class MappedWithExtension {} + @Document("${mongo.entity.collection}") + class MappedWithExtensionPropertyPlaceholderStyle {} + @Document("${value.from.file}") class MappedWithValue {}