From e643d39fa6e2fda2cdd5ea020f3cf0e370a6e6ce Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 8 Oct 2013 12:37:18 +0200 Subject: [PATCH] DATAMONGO-761 - Fix path key lookup for non-properties in SpringDataMongoDBSerializer. In our Querydsl MongodbSerializer implementation we now only inspect the MongoPersistentProperty for a field name if the given path is really a property path. Previously we tried to always resolve a persistent property even if the given path was an array index path, a map key or the like. --- .../support/SpringDataMongodbSerializer.java | 5 +++++ .../SpringDataMongodbSerializerUnitTests.java | 21 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java index f74bee23b..0cfda50f0 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java @@ -28,6 +28,7 @@ import com.mongodb.DBObject; import com.mysema.query.mongodb.MongodbSerializer; import com.mysema.query.types.Path; import com.mysema.query.types.PathMetadata; +import com.mysema.query.types.PathType; /** * Custom {@link MongodbSerializer} to take mapping information into account when building keys for constraints. @@ -61,6 +62,10 @@ class SpringDataMongodbSerializer extends MongodbSerializer { @Override protected String getKeyForPath(Path expr, PathMetadata metadata) { + if (!metadata.getPathType().equals(PathType.PROPERTY)) { + return super.getKeyForPath(expr, metadata); + } + Path parent = metadata.getParent(); MongoPersistentEntity entity = mappingContext.getPersistentEntity(parent.getType()); MongoPersistentProperty property = entity.getPersistentProperty(metadata.getName()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java index ec8655077..fb7622a04 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java @@ -36,6 +36,7 @@ import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mysema.query.types.expr.BooleanOperation; import com.mysema.query.types.path.PathBuilder; +import com.mysema.query.types.path.SimplePath; import com.mysema.query.types.path.StringPath; /** @@ -46,8 +47,7 @@ import com.mysema.query.types.path.StringPath; @RunWith(MockitoJUnitRunner.class) public class SpringDataMongodbSerializerUnitTests { - @Mock - MongoDbFactory dbFactory; + @Mock MongoDbFactory dbFactory; MongoConverter converter; SpringDataMongodbSerializer serializer; @@ -117,10 +117,23 @@ public class SpringDataMongodbSerializerUnitTests { assertThat(result.get("_id"), is((Object) id)); } + /** + * @see DATAMONGO-761 + */ + @Test + public void looksUpKeyForNonPropertyPath() { + + PathBuilder
builder = new PathBuilder
(Address.class, "address"); + SimplePath firstElementPath = builder.getArray("foo", String[].class).get(0); + String path = serializer.getKeyForPath(firstElementPath, firstElementPath.getMetadata()); + + assertThat(path, is("0")); + } + class Address { String id; String street; - @Field("zip_code") - String zipCode; + @Field("zip_code") String zipCode; + @Field("bar") String[] foo; } }