From 9ebe1439f1e0440b3d873845e1a96dc2a04cc6e5 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 fb18a5f4b..993ee6d93 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 @@ -1318,4 +1318,11 @@ public abstract class AbstractPersonRepositoryIntegrationTests { .isInstanceOf(AggregationResults.class) // .containsExactly(new SumAge(245L)); } + + @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 19b445ec5..b7247965b 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 @@ -388,4 +388,7 @@ public interface PersonRepository extends MongoRepository, Query @Aggregation(pipeline = "{ '$group' : { '_id' : null, 'total' : { $sum: '$age' } } }") AggregationResults sumAgeAndReturnAggregationResultWrapperWithConcreteType(); + + @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 0124d7db9..12054fa3d 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 @@ -527,6 +527,16 @@ public class ReactiveMongoRepositoryTests { .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, ReactiveQuerydslPredicateExecutor { @@ -587,6 +597,9 @@ public class ReactiveMongoRepositoryTests { @Aggregation(pipeline = "{ '$group' : { '_id' : null, 'total' : { $sum: '$age' } } }") Mono sumAgeAndReturnSumWrapper(); + + @Query(value = "{_id:?0}") + Mono findDocumentById(String id); } interface ReactiveContactRepository extends ReactiveMongoRepository {}