From 6604c507ddfaffd8fd9f46b9a6d220fd2a3fd11d 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 a23e4849a..d9dd171f2 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 @@ -1283,9 +1283,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 4981d63d4..d33ac9d7b 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 @@ -56,6 +56,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.MongoClientSettings; @@ -987,6 +988,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; @@ -1158,4 +1169,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; + } + } }