From 9ced611ea5f8ec551ba080c26448f57fc0b4cd2e Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 16 Jul 2020 14:53:40 +0200 Subject: [PATCH] DATACMNS-1762 - Remove ReactiveWrappers support from from QueryExecutionConverters. ReactiveWrappers doesn't belong in there in the first place so we're removing ReactiveWrappers support from QueryExecutionConverters so ReactiveWrappers is used from parts that need to be reactive-aware. Original Pull Request: #459 --- .../core/support/AbstractRepositoryMetadata.java | 10 +++++++++- .../repository/core/support/MethodLookups.java | 4 ++-- .../util/QueryExecutionConverters.java | 4 ---- .../util/ReactiveWrapperConverters.java | 16 ++++++++++++++++ .../util/QueryExecutionConvertersUnitTests.java | 16 ---------------- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java b/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java index 44b6c6f57..a02d4c7ab 100644 --- a/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java +++ b/src/main/java/org/springframework/data/repository/core/support/AbstractRepositoryMetadata.java @@ -27,6 +27,7 @@ import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.CrudMethods; import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.util.QueryExecutionConverters; +import org.springframework.data.repository.util.ReactiveWrapperConverters; import org.springframework.data.repository.util.ReactiveWrappers; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.KotlinReflectionUtils; @@ -105,7 +106,14 @@ public abstract class AbstractRepositoryMetadata implements RepositoryMetadata { * @see org.springframework.data.repository.core.RepositoryMetadata#getReturnedDomainClass(java.lang.reflect.Method) */ public Class getReturnedDomainClass(Method method) { - return QueryExecutionConverters.unwrapWrapperTypes(getReturnType(method)).getType(); + + TypeInformation returnType = getReturnType(method); + + if (ReactiveWrapperConverters.supports(returnType.getType())) { + return ReactiveWrapperConverters.unwrapWrapperTypes(returnType).getType(); + } + + return QueryExecutionConverters.unwrapWrapperTypes(returnType).getType(); } /* diff --git a/src/main/java/org/springframework/data/repository/core/support/MethodLookups.java b/src/main/java/org/springframework/data/repository/core/support/MethodLookups.java index a02180f19..4fccfa885 100644 --- a/src/main/java/org/springframework/data/repository/core/support/MethodLookups.java +++ b/src/main/java/org/springframework/data/repository/core/support/MethodLookups.java @@ -38,6 +38,7 @@ import org.springframework.data.repository.core.RepositoryMetadata; import org.springframework.data.repository.core.support.MethodLookup.MethodPredicate; import org.springframework.data.repository.util.QueryExecutionConverters; import org.springframework.data.repository.util.ReactiveWrapperConverters; +import org.springframework.data.repository.util.ReactiveWrappers; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; @@ -300,8 +301,7 @@ interface MethodLookups { Assert.notNull(parameterType, "Parameter type must not be null!"); - return QueryExecutionConverters.supports(parameterType) - && !QueryExecutionConverters.supportsUnwrapping(parameterType); + return ReactiveWrappers.supports(parameterType); } /** diff --git a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java index 8fc7dbe6c..a585a8f6b 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -168,10 +168,6 @@ public abstract class QueryExecutionConverters { } } - if (ReactiveWrappers.supports(type)) { - return true; - } - return false; }); } 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 c88b8e4b5..fc758430d 100644 --- a/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java +++ b/src/main/java/org/springframework/data/repository/util/ReactiveWrapperConverters.java @@ -43,6 +43,7 @@ import org.springframework.core.convert.converter.ConverterFactory; import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.GenericConversionService; import org.springframework.data.repository.util.ReactiveWrappers.ReactiveLibrary; +import org.springframework.data.util.TypeInformation; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; @@ -149,6 +150,21 @@ public abstract class ReactiveWrapperConverters { && RegistryHolder.REACTIVE_ADAPTER_REGISTRY.getAdapter(type) != null; } + /** + * Recursively unwraps well known wrapper types from the given {@link TypeInformation}. + * + * @param type must not be {@literal null}. + * @return will never be {@literal null}. + */ + public static TypeInformation unwrapWrapperTypes(TypeInformation type) { + + Assert.notNull(type, "type must not be null"); + + Class rawType = type.getType(); + + return supports(rawType) ? unwrapWrapperTypes(type.getRequiredComponentType()) : type; + } + /** * Casts or adopts the given wrapper type to a target wrapper type. * diff --git a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java index 10ab991eb..ea8882198 100755 --- a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java @@ -82,22 +82,6 @@ class QueryExecutionConvertersUnitTests { assertThat(QueryExecutionConverters.supports(io.vavr.control.Option.class)).isTrue(); } - @Test // DATACMNS-836 - void registersReactiveWrapperTypes() { - - assertThat(QueryExecutionConverters.supports(Publisher.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(Mono.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(Flux.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(Single.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(Completable.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(Observable.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(io.reactivex.Single.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(io.reactivex.Maybe.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(io.reactivex.Completable.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(io.reactivex.Flowable.class)).isTrue(); - assertThat(QueryExecutionConverters.supports(io.reactivex.Observable.class)).isTrue(); - } - @Test // DATACMNS-836 void registersUnwrapperTypes() {