diff --git a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java index 8b9d7aaec..0aeaaed53 100644 --- a/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java +++ b/src/main/java/org/springframework/data/repository/core/support/DefaultRepositoryInformation.java @@ -32,6 +32,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Supplier; import org.springframework.core.MethodParameter; import org.springframework.core.ResolvableType; @@ -41,6 +42,7 @@ import org.springframework.data.repository.Repository; import org.springframework.data.repository.core.CrudMethods; import org.springframework.data.repository.core.RepositoryInformation; import org.springframework.data.repository.core.RepositoryMetadata; +import org.springframework.data.util.Optionals; import org.springframework.data.util.ReflectionUtils; import org.springframework.data.util.Streamable; import org.springframework.util.Assert; @@ -238,15 +240,17 @@ class DefaultRepositoryInformation implements RepositoryInformation { * @return */ Method getTargetClassMethod(Method method, Optional> baseClass) { - return baseClass.map(it -> { - return Optional.ofNullable(findMethod(it, method.getName(), method.getParameterTypes())).orElseGet(() -> { - return Arrays.stream(it.getMethods())// - .filter(baseClassMethod -> method.getName().equals(baseClassMethod.getName()))// Right name - .filter(baseClassMethod -> method.getParameterTypes().length == baseClassMethod.getParameterTypes().length) - .filter(baseClassMethod -> parametersMatch(method, baseClassMethod))// All parameters match - .findFirst().orElse(method); - }); - }).orElse(method); + + Supplier> directMatch = () -> baseClass + .map(it -> findMethod(it, method.getName(), method.getParameterTypes())); + + Supplier> detailedComparison = () -> baseClass.flatMap(it -> Arrays.stream(it.getMethods())// + .filter(baseClassMethod -> method.getName().equals(baseClassMethod.getName()))// Right name + .filter(baseClassMethod -> method.getParameterTypes().length == baseClassMethod.getParameterTypes().length) + .filter(baseClassMethod -> parametersMatch(method, baseClassMethod))// All parameters match + .findFirst()); + + return Optionals.firstNonEmpty(directMatch, detailedComparison).orElse(method); } /* 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 9cff0cdf8..1f5c007bf 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -25,8 +25,6 @@ import scala.Function0; import scala.Option; import scala.runtime.AbstractFunction0; -import java.lang.reflect.Method; -import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -46,7 +44,6 @@ import org.springframework.data.domain.Slice; import org.springframework.scheduling.annotation.AsyncResult; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import org.springframework.util.ReflectionUtils; import org.springframework.util.concurrent.ListenableFuture; import com.google.common.base.Optional; @@ -479,21 +476,13 @@ public abstract class QueryExecutionConverters { */ private static class NullableWrapperToJavaslangOptionConverter extends AbstractWrapperTypeConverter { - private static final Method OF_METHOD; - private static final Method NONE_METHOD; - - static { - OF_METHOD = ReflectionUtils.findMethod(javaslang.control.Option.class, "of", Object.class); - NONE_METHOD = ReflectionUtils.findMethod(javaslang.control.Option.class, "none"); - } - /** * Creates a new {@link NullableWrapperToJavaslangOptionConverter} using the given {@link ConversionService}. * * @param conversionService must not be {@literal null}. */ public NullableWrapperToJavaslangOptionConverter(ConversionService conversionService) { - super(conversionService, createEmptyOption(), javaslang.control.Option.class); + super(conversionService, javaslang.control.Option.none(), getWrapperType()); } public static WrapperType getWrapperType() { @@ -505,14 +494,8 @@ public abstract class QueryExecutionConverters { * @see org.springframework.data.repository.util.QueryExecutionConverters.AbstractWrapperTypeConverter#wrap(java.lang.Object) */ @Override - @SuppressWarnings("unchecked") protected Object wrap(Object source) { - return (javaslang.control.Option) ReflectionUtils.invokeMethod(OF_METHOD, null, source); - } - - @SuppressWarnings("unchecked") - private static javaslang.control.Option createEmptyOption() { - return (javaslang.control.Option) ReflectionUtils.invokeMethod(NONE_METHOD, null); + return javaslang.control.Option.of(source); } } diff --git a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java index da3de0564..1989b2a6d 100755 --- a/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/DefaultRepositoryInformationUnitTests.java @@ -242,11 +242,11 @@ public class DefaultRepositoryInformationUnitTests { RepositoryMetadata metadata = new DefaultRepositoryMetadata(FooRepository.class); RepositoryInformation information = new DefaultRepositoryInformation(metadata, CrudRepository.class, - customImplementation.getClass()); + Optional.of(customImplementation.getClass())); Method method = FooRepository.class.getMethod("staticMethod"); - assertThat(information.getQueryMethods(), not(hasItem(method))); + assertThat(information.getQueryMethods()).doesNotContain(method); } @Test // DATACMNS-939 @@ -254,11 +254,11 @@ public class DefaultRepositoryInformationUnitTests { RepositoryMetadata metadata = new DefaultRepositoryMetadata(FooRepository.class); RepositoryInformation information = new DefaultRepositoryInformation(metadata, CrudRepository.class, - customImplementation.getClass()); + Optional.of(customImplementation.getClass())); Method method = FooRepository.class.getMethod("defaultMethod"); - assertThat(information.getQueryMethods(), not(hasItem(method))); + assertThat(information.getQueryMethods()).doesNotContain(method); } @Test // DATACMNS-943 diff --git a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java index cc67cd795..4b3ea4001 100755 --- a/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/RepositoryFactorySupportUnitTests.java @@ -281,7 +281,7 @@ public class RepositoryFactorySupportUnitTests { ObjectRepository repository = factory.getRepository(ObjectRepository.class, customImplementation); - assertThat(repository.staticMethodDelegate(), is(equalTo("OK"))); + assertThat(repository.staticMethodDelegate()).isEqualTo("OK"); verifyZeroInteractions(customImplementation); verifyZeroInteractions(backingRepo); 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 6c5bf6153..8b4b02670 100755 --- a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java @@ -186,7 +186,7 @@ public class QueryExecutionConvertersUnitTests { @SuppressWarnings("unchecked") public void turnsNullIntoJavaslangOption() { assertThat(conversionService.convert(new NullableWrapper(null), javaslang.control.Option.class)) - .isEqualTo(optionNone()); + .isEqualTo(javaslang.control.Option.none()); } @Test // DATACMNS-937