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() {