From 895311c2085186beb6bcb6cd98d634e4e22cdbbb Mon Sep 17 00:00:00 2001 From: Gerrit Meier Date: Wed, 24 Jun 2020 15:51:02 +0200 Subject: [PATCH] DATACMNS-1753 - Don't consider CompletableFuture as reactive type. CompletableFuture use is permitted in imperative repositories so we should not use CompletableFuture as indicator to switch a repository implementation to a reactive one. Original pull request: #450. --- .../data/repository/util/ReactiveWrapperConverters.java | 3 ++- .../data/repository/util/ReactiveWrappers.java | 9 +++++++-- .../util/ReactiveWrapperConvertersUnitTests.java | 7 +++++++ .../data/repository/util/ReactiveWrappersUnitTests.java | 5 +++++ 4 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java index 0b32e02e5..c89f76b9b 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java @@ -130,7 +130,8 @@ public class ReactiveWrapperConverters { */ public static boolean supports(Class type) { return RegistryHolder.REACTIVE_ADAPTER_REGISTRY != null - && RegistryHolder.REACTIVE_ADAPTER_REGISTRY.getAdapter(type) != null; + && RegistryHolder.REACTIVE_ADAPTER_REGISTRY.getAdapter(type) != null + && RegistryHolder.REACTIVE_ADAPTER_REGISTRY.getAdapter(type).getDescriptor().isDeferred(); } /** diff --git a/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java b/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java index dfaa3543f..be04233bc 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrappers.java @@ -137,7 +137,9 @@ public class ReactiveWrappers { return Arrays.stream(type.getMethods())// .flatMap(ReflectionUtils::returnTypeAndParameters)// - .anyMatch(ReactiveWrapperConverters::supports); + .anyMatch(possibleReactiveSupportedType -> + ReactiveWrapperConverters.supports(possibleReactiveSupportedType) + && findDescriptor(possibleReactiveSupportedType).isPresent()); } /** @@ -247,7 +249,10 @@ public class ReactiveWrappers { } ReactiveAdapter adapter = adapterRegistry.getAdapter(type); + if (adapter != null && adapter.getDescriptor().isDeferred()) { + return Optional.ofNullable(adapter.getDescriptor()); + } - return Optional.ofNullable(adapter == null ? null : adapter.getDescriptor()); + return Optional.empty(); } } diff --git a/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java b/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java index cc3f4191d..dfa9cc2c8 100644 --- a/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/ReactiveWrapperConvertersUnitTests.java @@ -24,6 +24,8 @@ import rx.Completable; import rx.Observable; import rx.Single; +import java.util.concurrent.CompletableFuture; + import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; @@ -61,6 +63,11 @@ class ReactiveWrapperConvertersUnitTests { assertThat(ReactiveWrapperConverters.supports(io.reactivex.Completable.class)).isTrue(); } + @Test // DATACMNS-1753 + void shouldNotSupportCompletableFuture() { + assertThat(ReactiveWrapperConverters.supports(CompletableFuture.class)).isFalse(); + } + @Test // DATACMNS-836 void toWrapperShouldCastMonoToMono() { diff --git a/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java b/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java index 25bdccebf..6d8f0ede9 100644 --- a/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/ReactiveWrappersUnitTests.java @@ -24,6 +24,8 @@ import reactor.core.publisher.Mono; import rx.Observable; import rx.Single; +import java.util.concurrent.CompletableFuture; + import org.junit.jupiter.api.Test; import org.reactivestreams.Publisher; @@ -41,6 +43,7 @@ class ReactiveWrappersUnitTests { assertThat(ReactiveWrappers.isNoValueType(Flux.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(Single.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(Completable.class)).isTrue(); + assertThat(ReactiveWrappers.isNoValueType(CompletableFuture.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(Observable.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(Publisher.class)).isFalse(); assertThat(ReactiveWrappers.isNoValueType(io.reactivex.Single.class)).isFalse(); @@ -56,6 +59,7 @@ class ReactiveWrappersUnitTests { assertThat(ReactiveWrappers.isSingleValueType(Flux.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(Single.class)).isTrue(); assertThat(ReactiveWrappers.isSingleValueType(Completable.class)).isFalse(); + assertThat(ReactiveWrappers.isSingleValueType(CompletableFuture.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(Observable.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(Publisher.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(io.reactivex.Single.class)).isTrue(); @@ -72,6 +76,7 @@ class ReactiveWrappersUnitTests { assertThat(ReactiveWrappers.isMultiValueType(Flux.class)).isTrue(); assertThat(ReactiveWrappers.isMultiValueType(Single.class)).isFalse(); assertThat(ReactiveWrappers.isSingleValueType(Completable.class)).isFalse(); + assertThat(ReactiveWrappers.isSingleValueType(CompletableFuture.class)).isFalse(); assertThat(ReactiveWrappers.isMultiValueType(Observable.class)).isTrue(); assertThat(ReactiveWrappers.isMultiValueType(Publisher.class)).isTrue(); assertThat(ReactiveWrappers.isMultiValueType(io.reactivex.Single.class)).isFalse();