Skip to content

Commit 2d17ae4

Browse files
committed
DATACMNS-836 - Encapsulate reactive type conversion in ReactiveWrapperConverters.
Reactive type conversion now happens fully inside of ReactiveWrapperConverters and does not require an external ConversionService. This change allows changes to reactive type conversion without changing the API since all details are encapsulated by ReactiveWrapperConverters.
1 parent 7607544 commit 2d17ae4

File tree

6 files changed

+83
-84
lines changed

6 files changed

+83
-84
lines changed

src/main/java/org/springframework/data/repository/core/support/QueryExecutionResultHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,13 @@ public QueryExecutionResultHandler() {
4444

4545
GenericConversionService conversionService = new DefaultConversionService();
4646
QueryExecutionConverters.registerConvertersIn(conversionService);
47-
ReactiveWrapperConverters.registerConvertersIn(conversionService);
4847

4948
this.conversionService = conversionService;
5049
}
5150

5251
/**
5352
* Post-processes the given result of a query invocation to the given type.
54-
*
53+
*
5554
* @param result can be {@literal null}.
5655
* @param returnTypeDescriptor can be {@literal null}, if so, no conversion is performed.
5756
* @return
@@ -87,6 +86,11 @@ public Object postProcessInvocationResult(Object result, TypeDescriptor returnTy
8786
}
8887

8988
if (result != null) {
89+
90+
if (ReactiveWrapperConverters.supports(expectedReturnType)) {
91+
return ReactiveWrapperConverters.toWrapper(result, expectedReturnType);
92+
}
93+
9094
return conversionService.canConvert(result.getClass(), expectedReturnType)
9195
? conversionService.convert(result, expectedReturnType) : result;
9296
}

src/main/java/org/springframework/data/repository/core/support/ReactiveRepositoryInformation.java

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727

2828
import org.springframework.core.MethodParameter;
2929
import org.springframework.core.convert.ConversionService;
30-
import org.springframework.core.convert.support.DefaultConversionService;
3130
import org.springframework.data.repository.core.RepositoryInformation;
3231
import org.springframework.data.repository.core.RepositoryMetadata;
3332
import org.springframework.data.repository.util.QueryExecutionConverters;
3433
import org.springframework.data.repository.util.ReactiveWrapperConverters;
34+
import org.springframework.data.repository.util.ReactiveWrappers;
3535
import org.springframework.util.Assert;
3636

3737
/**
@@ -110,7 +110,7 @@ static boolean isNonUnwrappingWrapper(Class<?> parameterType) {
110110

111111
/**
112112
* Returns whether the given {@link Method} uses a reactive wrapper type as parameter.
113-
*
113+
*
114114
* @param method must not be {@literal null}.
115115
* @return
116116
*/
@@ -125,7 +125,7 @@ private static boolean usesParametersWithReactiveWrappers(Method method) {
125125
/**
126126
* Returns a candidate method from the base class for the given one or the method given in the first place if none one
127127
* the base class matches.
128-
*
128+
*
129129
* @param method must not be {@literal null}.
130130
* @param baseClass must not be {@literal null}.
131131
* @param predicate must not be {@literal null}.
@@ -189,8 +189,6 @@ private static boolean parametersMatch(Method method, Method baseClassMethod,
189189
@RequiredArgsConstructor(staticName = "of")
190190
static class WrapperConversionMatch implements BiPredicate<Class<?>, Integer> {
191191

192-
private static final ConversionService CONVERSION_SERVICE = ReactiveWrapperConverters
193-
.registerConvertersIn(new DefaultConversionService());
194192
private final Class<?>[] declaredParameterTypes;
195193

196194
/*
@@ -208,7 +206,8 @@ public boolean test(Class<?> candidateParameterType, Integer index) {
208206
return false;
209207
}
210208

211-
return CONVERSION_SERVICE.canConvert(declaredParameterTypes[index], candidateParameterType);
209+
return ReactiveWrappers.isAvailable()
210+
&& ReactiveWrapperConverters.canConvert(declaredParameterTypes[index], candidateParameterType);
212211
}
213212
}
214213

@@ -244,7 +243,7 @@ public boolean test(Class<?> candidateParameterType, Integer index) {
244243
/**
245244
* {@link BiPredicate} to check parameter assignability between a parameters in which the declared parameter may be
246245
* wrapped but supports unwrapping. Usually types like {@link java.util.Optional} or {@link java.util.stream.Stream}.
247-
*
246+
*
248247
* @see QueryExecutionConverters
249248
*/
250249
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)

src/main/java/org/springframework/data/repository/core/support/RepositoryFactorySupport.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
import org.springframework.beans.factory.BeanFactoryAware;
3636
import org.springframework.core.GenericTypeResolver;
3737
import org.springframework.core.MethodParameter;
38-
import org.springframework.core.convert.ConversionService;
3938
import org.springframework.core.convert.TypeDescriptor;
40-
import org.springframework.core.convert.support.DefaultConversionService;
4139
import org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor;
4240
import org.springframework.data.projection.SpelAwareProxyProjectionFactory;
4341
import org.springframework.data.repository.Repository;
@@ -53,6 +51,7 @@
5351
import org.springframework.data.repository.query.RepositoryQuery;
5452
import org.springframework.data.repository.util.ClassUtils;
5553
import org.springframework.data.repository.util.ReactiveWrapperConverters;
54+
import org.springframework.data.repository.util.ReactiveWrappers;
5655
import org.springframework.data.util.ReflectionUtils;
5756
import org.springframework.util.Assert;
5857
import org.springframework.util.ObjectUtils;
@@ -482,7 +481,7 @@ private Object doInvoke(MethodInvocation invocation) throws Throwable {
482481

483482
/**
484483
* Returns whether we know of a query to execute for the given {@link Method};
485-
*
484+
*
486485
* @param method
487486
* @return
488487
*/
@@ -583,9 +582,6 @@ private boolean isCustomMethodInvocation(MethodInvocation invocation) {
583582
*/
584583
public class ConvertingImplementationMethodExecutionInterceptor extends ImplementationMethodExecutionInterceptor {
585584

586-
private final ConversionService conversionService = ReactiveWrapperConverters
587-
.registerConvertersIn(new DefaultConversionService());
588-
589585
/**
590586
* @param repositoryInformation
591587
* @param customImplementation
@@ -624,15 +620,12 @@ private Object[] convertParameters(Class<?>[] parameterTypes, Object[] parameter
624620
continue;
625621
}
626622

627-
if (parameterTypes[i].isAssignableFrom(parameters[i].getClass())
628-
|| !conversionService.canConvert(parameters[i].getClass(), parameterTypes[i])) {
629-
630-
result[i] = parameters[i];
631-
623+
if (!parameterTypes[i].isAssignableFrom(parameters[i].getClass()) && ReactiveWrappers.isAvailable()
624+
&& ReactiveWrapperConverters.canConvert(parameters[i].getClass(), parameterTypes[i])) {
625+
result[i] = ReactiveWrapperConverters.toWrapper(parameters[i], parameterTypes[i]);
632626
} else {
633-
result[i] = conversionService.convert(parameters[i], parameterTypes[i]);
627+
result[i] = parameters[i];
634628
}
635-
636629
}
637630

638631
return result;

0 commit comments

Comments
 (0)