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
This commit is contained in:
Mark Paluch
2020-07-16 14:53:40 +02:00
committed by Christoph Strobl
parent eadbe80f03
commit 9ced611ea5
5 changed files with 27 additions and 23 deletions

View File

@@ -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();
}
/*

View File

@@ -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);
}
/**

View File

@@ -168,10 +168,6 @@ public abstract class QueryExecutionConverters {
}
}
if (ReactiveWrappers.supports(type)) {
return true;
}
return false;
});
}

View File

@@ -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.
*

View File

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