From eeddc860f781927db392bf1a86f2fb68d0e2f805 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 17 Apr 2020 11:15:42 +0200 Subject: [PATCH] DATAMONGO-2517 - Fix invalid entity creation for text queries. Fix a glitch in the MappingMongoConverter that uses the single String argument constructor (since it matches in type and parameter count to the given input string) to falsely instantiate an Entity when it should not. Original pull request: #857. --- .../core/convert/MappingMongoConverter.java | 9 +++++--- .../core/convert/QueryMapperUnitTests.java | 23 +++++++++++++++++++ 2 files changed, 29 insertions(+), 3 deletions(-) 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 f5dadf4a8..7c9c13ff3 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 @@ -1263,9 +1263,12 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } if (conversions.isSimpleType(obj.getClass())) { - // Doesn't need conversion - return getPotentiallyConvertedSimpleWrite(obj, - typeInformation != null ? typeInformation.getType() : Object.class); + + Class conversionTargetType = Object.class; + if(typeInformation != null && conversions.isSimpleType(typeInformation.getType())) { + conversionTargetType = typeInformation.getType(); + } + return getPotentiallyConvertedSimpleWrite(obj, conversionTargetType); } if (obj instanceof List) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java index 00c4c98e7..e067d0bc2 100755 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java @@ -55,6 +55,7 @@ import org.springframework.data.mongodb.core.mapping.TextScore; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.data.mongodb.core.query.TextQuery; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; @@ -988,6 +989,16 @@ public class QueryMapperUnitTests { .isEqualTo(new org.bson.Document("level0.$[some_item].arrayCustomName.$[other_item].nes-ted", "value")); } + @Test // DATAMONGO-2517 + public void shouldParseNestedKeywordWithArgumentMatchingTheSourceEntitiesConstructorCorrectly() { + + TextQuery source = new TextQuery("test"); + + org.bson.Document target = mapper.getMappedObject(source.getQueryObject(), + context.getPersistentEntity(WithSingleStringArgConstructor.class)); + assertThat(target).isEqualTo(org.bson.Document.parse("{\"$text\" : { \"$search\" : \"test\" }}")); + } + class WithDeepArrayNesting { List level0; @@ -1159,4 +1170,16 @@ public class QueryMapperUnitTests { String id; @Field(targetType = FieldType.OBJECT_ID) String stringAsOid; } + + @Document + static class WithSingleStringArgConstructor { + + String value; + + public WithSingleStringArgConstructor() {} + + public WithSingleStringArgConstructor(String value) { + this.value = value; + } + } }