Skip to content

Commit c3259e3

Browse files
mp911dechristophstrobl
authored andcommitted
Avoid nested Document conversion to primitive types for fields with an explicit write target.
We now no longer attempt to convert query Documents into primitive types to avoid e.g. Document to String conversion. Closes: #3783 Original Pull Request: #3797
1 parent 3526b6a commit c3259e3

File tree

2 files changed

+31
-11
lines changed

2 files changed

+31
-11
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,8 @@ protected boolean isKeyword(String candidate) {
772772
@Nullable
773773
private Object applyFieldTargetTypeHintToValue(Field documentField, @Nullable Object value) {
774774

775-
if (value == null || documentField.getProperty() == null || !documentField.getProperty().hasExplicitWriteTarget()) {
775+
if (value == null || documentField.getProperty() == null || !documentField.getProperty().hasExplicitWriteTarget()
776+
|| value instanceof Document || value instanceof DBObject) {
776777
return value;
777778
}
778779

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java

+29-10
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,6 @@
3333
import org.bson.types.ObjectId;
3434
import org.junit.jupiter.api.BeforeEach;
3535
import org.junit.jupiter.api.Test;
36-
import org.junit.jupiter.api.extension.ExtendWith;
37-
import org.mockito.Mock;
38-
import org.mockito.junit.jupiter.MockitoExtension;
39-
import org.mockito.junit.jupiter.MockitoSettings;
40-
import org.mockito.quality.Strictness;
4136

4237
import org.springframework.core.convert.converter.Converter;
4338
import org.springframework.data.annotation.Id;
@@ -79,22 +74,21 @@
7974
* @author Mark Paluch
8075
* @author David Julia
8176
*/
82-
@ExtendWith(MockitoExtension.class)
83-
@MockitoSettings(strictness = Strictness.LENIENT)
8477
public class QueryMapperUnitTests {
8578

8679
private QueryMapper mapper;
8780
private MongoMappingContext context;
8881
private MappingMongoConverter converter;
8982

90-
@Mock MongoDatabaseFactory factory;
91-
9283
@BeforeEach
9384
void beforeEach() {
9485

86+
MongoCustomConversions conversions = new MongoCustomConversions();
9587
this.context = new MongoMappingContext();
88+
this.context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
9689

97-
this.converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), context);
90+
this.converter = new MappingMongoConverter(NoOpDbRefResolver.INSTANCE, context);
91+
this.converter.setCustomConversions(conversions);
9892
this.converter.afterPropertiesSet();
9993

10094
this.mapper = new QueryMapper(converter);
@@ -1333,6 +1327,25 @@ void mapStringIdFieldProjection() {
13331327
assertThat(mappedFields).containsEntry("_id", 1);
13341328
}
13351329

1330+
@Test // GH-3783
1331+
void retainsId$InWithStringArray() {
1332+
1333+
org.bson.Document mappedQuery = mapper.getMappedObject(
1334+
org.bson.Document.parse("{ _id : { $in: [\"5b8bedceb1e0bfc07b008828\"]}}"),
1335+
context.getPersistentEntity(WithExplicitStringId.class));
1336+
assertThat(mappedQuery.get("_id")).isEqualTo(org.bson.Document.parse("{ $in: [\"5b8bedceb1e0bfc07b008828\"]}"));
1337+
}
1338+
1339+
@Test // GH-3783
1340+
void mapsId$InInToObjectIds() {
1341+
1342+
org.bson.Document mappedQuery = mapper.getMappedObject(
1343+
org.bson.Document.parse("{ _id : { $in: [\"5b8bedceb1e0bfc07b008828\"]}}"),
1344+
context.getPersistentEntity(ClassWithDefaultId.class));
1345+
assertThat(mappedQuery.get("_id"))
1346+
.isEqualTo(org.bson.Document.parse("{ $in: [ {$oid: \"5b8bedceb1e0bfc07b008828\" } ]}"));
1347+
}
1348+
13361349
class WithDeepArrayNesting {
13371350

13381351
List<WithNestedArray> level0;
@@ -1402,6 +1415,12 @@ class WithStringId {
14021415
String name;
14031416
}
14041417

1418+
class WithExplicitStringId {
1419+
1420+
@MongoId(FieldType.STRING) String id;
1421+
String name;
1422+
}
1423+
14051424
class BigIntegerId {
14061425

14071426
@Id private BigInteger id;

0 commit comments

Comments
 (0)