DATACMNS-1762 - Reintroduce calls to ReactiveWrapperConverters.supports(…) after decoupling from QueryExecutionConverters.

We now consider reactive wrapper types in all areas that previously relied on QueryExecutionConverters to handle reactive type information correctly. Specifically, we call supports(…) and perform type unwrapping to ensure to detect the correct return type.
This commit is contained in:
Mark Paluch
2020-09-25 16:25:35 +02:00
parent af9dd6110d
commit d10560f238
7 changed files with 31 additions and 11 deletions

View File

@@ -109,11 +109,7 @@ public abstract class AbstractRepositoryMetadata implements RepositoryMetadata {
TypeInformation<?> returnType = getReturnType(method);
if (ReactiveWrapperConverters.supports(returnType.getType())) {
return ReactiveWrapperConverters.unwrapWrapperTypes(returnType).getType();
}
return ReactiveWrapperConverters.unwrapWrapperTypes(QueryExecutionConverters.unwrapWrapperTypes(returnType))
return QueryExecutionConverters.unwrapWrapperTypes(ReactiveWrapperConverters.unwrapWrapperTypes(returnType))
.getType();
}

View File

@@ -126,7 +126,8 @@ class QueryExecutionResultHandler {
result = unwrapOptional(result);
if (QueryExecutionConverters.supports(expectedReturnType)) {
if (QueryExecutionConverters.supports(expectedReturnType)
|| ReactiveWrapperConverters.supports(expectedReturnType)) {
// For a wrapper type, try nested resolution first
result = postProcessInvocationResult(result, nestingLevel + 1, descriptor);

View File

@@ -230,7 +230,7 @@ public class Parameter {
TypeInformation<Object> returnType = ClassTypeInformation.fromReturnTypeOf(method);
return bound
.equals(ReactiveWrapperConverters.unwrapWrapperTypes(QueryExecutionConverters.unwrapWrapperTypes(returnType)));
.equals(QueryExecutionConverters.unwrapWrapperTypes(ReactiveWrapperConverters.unwrapWrapperTypes(returnType)));
}
/**

View File

@@ -21,6 +21,7 @@ import java.util.Optional;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.util.QueryExecutionConverters;
import org.springframework.data.repository.util.ReactiveWrapperConverters;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@@ -64,7 +65,8 @@ public class ParametersParameterAccessor implements ParameterAccessor {
private static boolean requiresUnwrapping(Object[] values) {
for (Object value : values) {
if (value != null && QueryExecutionConverters.supports(value.getClass())) {
if (value != null && (QueryExecutionConverters.supports(value.getClass())
|| ReactiveWrapperConverters.supports(value.getClass()))) {
return true;
}
}

View File

@@ -29,6 +29,7 @@ import org.springframework.data.projection.ProjectionFactory;
import org.springframework.data.repository.core.EntityMetadata;
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.util.ClassTypeInformation;
import org.springframework.data.util.Lazy;
import org.springframework.data.util.TypeInformation;
@@ -271,7 +272,8 @@ public class QueryMethod {
private static Class<? extends Object> potentiallyUnwrapReturnTypeFor(RepositoryMetadata metadata, Method method) {
TypeInformation<?> returnType = metadata.getReturnType(method);
if (QueryExecutionConverters.supports(returnType.getType())) {
if (QueryExecutionConverters.supports(returnType.getType())
|| ReactiveWrapperConverters.supports(returnType.getType())) {
// unwrap only one level to handle cases like Future<List<Entity>> correctly.

View File

@@ -187,6 +187,8 @@ public abstract class ClassUtils {
private static TypeInformation<?> getEffectivelyReturnedTypeFrom(Method method) {
TypeInformation<?> returnType = ClassTypeInformation.fromReturnTypeOf(method);
return QueryExecutionConverters.supports(returnType.getType()) ? returnType.getRequiredComponentType() : returnType;
return QueryExecutionConverters.supports(returnType.getType())
|| ReactiveWrapperConverters.supports(returnType.getType()) ? returnType.getRequiredComponentType()
: returnType;
}
}