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 d3b3f186f..e3b8e9a49 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 @@ -19,6 +19,7 @@ import lombok.NonNull; import lombok.RequiredArgsConstructor; import reactor.core.publisher.Flux; +import org.reactivestreams.Publisher; import org.springframework.core.convert.converter.Converter; import org.springframework.data.convert.EntityInstantiators; import org.springframework.data.domain.Pageable; @@ -168,6 +169,10 @@ interface ReactiveMongoQueryExecution { ReturnedType returnedType = processor.getReturnedType(); + if (returnsMonoVoid(returnedType)) { + return Flux.from((Publisher) source).then(); + } + if (ClassUtils.isPrimitiveOrWrapper(returnedType.getReturnedType())) { return source; } @@ -182,4 +187,8 @@ interface ReactiveMongoQueryExecution { return processor.processResult(source, converter); } } + + static boolean returnsMonoVoid(ReturnedType returnedType) { + return returnedType.getReturnedType() == Void.class; + } } 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 1f92d9466..e38c6782c 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 @@ -17,6 +17,8 @@ package org.springframework.data.mongodb.repository; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.domain.Sort.Direction.*; +import static org.springframework.data.mongodb.core.query.Criteria.*; +import static org.springframework.data.mongodb.core.query.Query.*; import static org.springframework.data.mongodb.test.util.Assertions.assertThat; import lombok.Data; @@ -575,6 +577,18 @@ public class ReactiveMongoRepositoryTests { .expectNext("lastname").verifyComplete(); } + @Test // DATAMONGO-2406 + public void deleteByShouldHandleVoidResultTypeCorrectly() { + + repository.deleteByLastname(dave.getLastname()) // + .as(StepVerifier::create) // + .verifyComplete(); + + template.find(query(where("lastname").is(dave.getLastname())), Person.class) // + .as(StepVerifier::create) // + .verifyComplete(); + } + interface ReactivePersonRepository extends ReactiveMongoRepository, ReactiveQuerydslPredicateExecutor { @@ -645,6 +659,8 @@ public class ReactiveMongoRepositoryTests { @Query(value = "{_id:?0}") Mono findDocumentById(String id); + + Mono deleteByLastname(String lastname); } interface ReactiveContactRepository extends ReactiveMongoRepository {}