Browse Source

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.
pull/862/head
Christoph Strobl 6 years ago committed by Mark Paluch
parent
commit
6604c507dd
No known key found for this signature in database
GPG Key ID: 51A00FA751B91849
  1. 9
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
  2. 23
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java

9
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())) { if (conversions.isSimpleType(obj.getClass())) {
// Doesn't need conversion
return getPotentiallyConvertedSimpleWrite(obj, Class<?> conversionTargetType = Object.class;
typeInformation != null ? typeInformation.getType() : Object.class); if(typeInformation != null && conversions.isSimpleType(typeInformation.getType())) {
conversionTargetType = typeInformation.getType();
}
return getPotentiallyConvertedSimpleWrite(obj, conversionTargetType);
} }
if (obj instanceof List) { if (obj instanceof List) {

23
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.BasicQuery;
import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextQuery;
import com.mongodb.BasicDBObject; import com.mongodb.BasicDBObject;
import com.mongodb.MongoClientSettings; 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")); .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 { class WithDeepArrayNesting {
List<WithNestedArray> level0; List<WithNestedArray> level0;
@ -1158,4 +1169,16 @@ public class QueryMapperUnitTests {
String id; String id;
@Field(targetType = FieldType.OBJECT_ID) String stringAsOid; @Field(targetType = FieldType.OBJECT_ID) String stringAsOid;
} }
@Document
static class WithSingleStringArgConstructor {
String value;
public WithSingleStringArgConstructor() {}
public WithSingleStringArgConstructor(String value) {
this.value = value;
}
}
} }

Loading…
Cancel
Save