From f4c9cdcacb5903e789054929e50cb1131c112db8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 30 Jan 2019 09:49:48 +0100 Subject: [PATCH] DATAMONGO-2193 - Fix String <> ObjectId conversion for non-Id properties. We now make sure to only convert valid ObjectId Strings if the property can be considered as id property. Original pull request: #640. --- .../mongodb/core/convert/QueryMapper.java | 7 +++-- .../data/mongodb/core/MongoTemplateTests.java | 31 +++++++++++++++++++ .../core/convert/QueryMapperUnitTests.java | 12 +++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index 31cf07052..2b97315e7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -931,8 +931,11 @@ public class QueryMapper { @Override public boolean isIdField() { - MongoPersistentProperty idProperty = (property != null && property.isIdProperty()) ? property - : entity.getIdProperty(); + if(property != null) { + return property.isIdProperty(); + } + + MongoPersistentProperty idProperty = entity.getIdProperty(); if (idProperty != null) { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index bb073c87c..c5e17dbcd 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -238,6 +238,7 @@ public class MongoTemplateTests { template.dropCollection(DocumentWithNestedTypeHavingStringIdProperty.class); template.dropCollection(ImmutableAudited.class); template.dropCollection(RawStringId.class); + template.dropCollection(Outer.class); } @Test @@ -3687,6 +3688,24 @@ public class MongoTemplateTests { assertThat(target).isEqualTo(source); } + @Test // DATAMONGO-2193 + public void shouldNotConvertStringToObjectIdForNonIdField() { + + ObjectId outerId = new ObjectId(); + String innerId = new ObjectId().toHexString(); + + org.bson.Document source = new org.bson.Document() // + .append("_id", outerId) // + .append("inner", new org.bson.Document("id", innerId).append("value", "boooh")); + + template.getDb().getCollection(template.getCollectionName(Outer.class)).insertOne(source); + + Outer target = template.findOne(query(where("inner.id").is(innerId)), Outer.class); + assertThat(target).isNotNull(); + assertThat(target.id).isEqualTo(outerId); + assertThat(target.inner.id).isEqualTo(innerId); + } + private AtomicReference createAfterSaveReference() { AtomicReference saved = new AtomicReference<>(); @@ -4209,4 +4228,16 @@ public class MongoTemplateTests { @MongoId String id; String value; } + + static class Outer { + + @Id ObjectId id; + Inner inner; + } + + static class Inner { + + @Field("id") String id; + String value; + } } 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 1c0262900..435efa090 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 @@ -819,6 +819,18 @@ public class QueryMapperUnitTests { assertThat(mappedObject).containsEntry("className", "foo"); } + @Test // DATAMONGO-2193 + public void shouldNotConvertHexStringToObjectIdForRenamedNestedIdField() { + + String idHex = new ObjectId().toHexString(); + Query query = new Query(where("nested.id").is(idHex)); + + org.bson.Document document = mapper.getMappedObject(query.getQueryObject(), + context.getPersistentEntity(RootForClassWithExplicitlyRenamedIdField.class)); + + assertThat(document).isEqualTo(new org.bson.Document("nested.id", idHex)); + } + @Document public class Foo { @Id private ObjectId id;