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 {}