From d365463f56c9c6c8694d651adb9a1ff2f9953f7f Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 3 Jul 2017 22:04:16 +0200 Subject: [PATCH] DATAMONGO-1729 - Open projections don't get field restrictions applied. We now only apply a field restriction if the projection used for a query is closed. --- .../repository/query/PartTreeMongoQuery.java | 2 +- .../query/PartTreeMongoQueryUnitTests.java | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java index 4c1da7bd9..19f67df94 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQuery.java @@ -98,7 +98,7 @@ public class PartTreeMongoQuery extends AbstractMongoQuery { ReturnedType returnedType = processor.withDynamicProjection(accessor).getReturnedType(); - if (returnedType.isProjecting()) { + if (returnedType.needsCustomConstruction()) { Field fields = query.fields(); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java index 9e578c9df..d28e355f9 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/PartTreeMongoQueryUnitTests.java @@ -30,6 +30,7 @@ import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.convert.DbRefResolver; @@ -206,6 +207,14 @@ public class PartTreeMongoQueryUnitTests { assertThat(query.getFieldsObject().get("firstname"), is((Object) 1)); } + @Test // DATAMONGO-1729 + public void doesNotCreateFieldsObjectForOpenProjection() { + + org.springframework.data.mongodb.core.query.Query query = deriveQueryFromMethod("findAllBy"); + + assertThat(query.getFieldsObject(), is(nullValue())); + } + private org.springframework.data.mongodb.core.query.Query deriveQueryFromMethod(String method, Object... args) { Class[] types = new Class[args.length]; @@ -266,6 +275,8 @@ public class PartTreeMongoQueryUnitTests { @Query(fields = "{ 'firstname' : 1 }") List findBySex(Sex sex); + + OpenProjection findAllBy(); } interface PersonProjection { @@ -290,4 +301,12 @@ public class PartTreeMongoQueryUnitTests { this.lastname = lastname; } } + + interface OpenProjection { + + String getFirstname(); + + @Value("#{target.firstname + ' ' + target.lastname}") + String getFullname(); + } }