From bc29f2b24ea635e2ba21cac51f0e5e5cd5bd8dd7 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 19 Sep 2019 08:58:48 +0200 Subject: [PATCH] DATAMONGO-2374 - Fix simple type result handling for repository query methods. Original pull request: #791. --- .../data/mongodb/core/PropertyOperations.java | 8 ++++++-- .../query/ReactiveMongoQueryExecution.java | 4 ++++ .../AbstractPersonRepositoryIntegrationTests.java | 7 +++++++ .../data/mongodb/repository/PersonRepository.java | 3 +++ .../repository/ReactiveMongoRepositoryTests.java | 13 +++++++++++++ 5 files changed, 33 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/PropertyOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/PropertyOperations.java index ccaf84ab9..4bfd81f35 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/PropertyOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/PropertyOperations.java @@ -66,8 +66,12 @@ class PropertyOperations { projectionInformation.getInputProperties().forEach(it -> projectedFields.append(it.getName(), 1)); } } else { - mappingContext.getRequiredPersistentEntity(targetType).doWithProperties( - (SimplePropertyHandler) persistentProperty -> projectedFields.append(persistentProperty.getName(), 1)); + + MongoPersistentEntity entity = mappingContext.getPersistentEntity(targetType); + if(entity != null) { + entity.doWithProperties( + (SimplePropertyHandler) persistentProperty -> projectedFields.append(persistentProperty.getName(), 1)); + } } return projectedFields; diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactiveMongoQueryExecution.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactiveMongoQueryExecution.java index a3e628aa8..0c1fa1681 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactiveMongoQueryExecution.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ReactiveMongoQueryExecution.java @@ -174,6 +174,10 @@ interface ReactiveMongoQueryExecution { return source; } + if(!operations.getConverter().getMappingContext().hasPersistentEntityFor(returnedType.getReturnedType())) { + return source; + } + Converter converter = new DtoInstantiatingConverter(returnedType.getReturnedType(), operations.getConverter().getMappingContext(), instantiators); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index aa79b2694..897c986a3 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -1302,4 +1302,11 @@ public abstract class AbstractPersonRepositoryIntegrationTests { // assertThat(target).isNotNull(); // assertThat(target.getShippingAddresses()).hasSize(1); } + + @Test // DATAMONGO-2374 + public void findsWithNativeProjection() { + + assertThat(repository.findDocumentById(dave.getId()).get()).containsEntry("firstname", dave.getFirstname()) + .containsEntry("lastname", dave.getLastname()); + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index 175cfcdc7..d56a318a4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -362,4 +362,7 @@ public interface PersonRepository extends MongoRepository, Query @Query(value = "{ 'shippingAddresses' : { '$elemMatch' : { 'city' : { '$eq' : 'lnz' } } } }", fields = "{ 'shippingAddresses.$': ?0 }") Person findWithArrayPositionInProjection(int position); + + @Query(value="{_id:?0}") + Optional findDocumentById(String id); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java index 80e13258e..f977c7381 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/ReactiveMongoRepositoryTests.java @@ -384,6 +384,16 @@ public class ReactiveMongoRepositoryTests implements BeanClassLoaderAware, BeanF .verifyComplete(); } + @Test // DATAMONGO-2374 + public void findsWithNativeProjection() { + + repository.findDocumentById(dave.getId()) // + .as(StepVerifier::create) // + .consumeNextWith(it -> { + assertThat(it).containsEntry("firstname", dave.getFirstname()).containsEntry("lastname", dave.getLastname()); + }).verifyComplete(); + } + interface ReactivePersonRepository extends ReactiveMongoRepository { Flux findByLastname(String lastname); @@ -422,6 +432,9 @@ public class ReactiveMongoRepositoryTests implements BeanClassLoaderAware, BeanF @Query(sort = "{ age : -1 }") Flux findByAgeGreaterThan(int age, Sort sort); + + @Query(value = "{_id:?0}") + Mono findDocumentById(String id); } interface ReactiveContactRepository extends ReactiveMongoRepository {}