From 429dcbf65939635687182c0f0c5eb46002485df5 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 22 Mar 2017 23:28:11 +0100 Subject: [PATCH] DATACMNS-867 - ReflectionRepositoryInvoker now avoids ConversionService for Optional creation. We now manually create Optional instances as the ConversionService converts single-argument collections into an optional with only that element. --- .../support/ReflectionRepositoryInvoker.java | 12 ++---------- .../ReflectionRepositoryInvokerUnitTests.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java index 47081eafe..50d05b5e7 100644 --- a/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java +++ b/src/main/java/org/springframework/data/repository/support/ReflectionRepositoryInvoker.java @@ -253,16 +253,8 @@ class ReflectionRepositoryInvoker implements RepositoryInvoker { @SuppressWarnings("unchecked") private Optional returnAsOptional(Object source) { - - if (Optional.class.isInstance(source)) { - return (Optional) source; - } - - if (source == null) { - return Optional.empty(); - } - - return conversionService.convert(QueryExecutionConverters.unwrap(source), Optional.class); + return (Optional) (Optional.class.isInstance(source) ? source + : Optional.ofNullable(QueryExecutionConverters.unwrap(source))); } /** diff --git a/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java b/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java index 2ca7a5d23..6805c71d5 100755 --- a/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/ReflectionRepositoryInvokerUnitTests.java @@ -254,6 +254,22 @@ public class ReflectionRepositoryInvokerUnitTests { assertThat(invokeFindOne).isPresent(); } + @Test // DATACMNS-867 + public void wrapsSingleElementCollectionIntoOptional() throws Exception { + + ManualCrudRepository mock = mock(ManualCrudRepository.class); + when(mock.findAll()).thenReturn(Arrays.asList(new Domain())); + + Method method = ManualCrudRepository.class.getMethod("findAll"); + + Optional result = getInvokerFor(mock).invokeQueryMethod(method, new LinkedMultiValueMap<>(), Pageable.unpaged(), + Sort.unsorted()); + + assertThat(result).hasValueSatisfying(it -> { + assertThat(it).isInstanceOf(Collection.class); + }); + } + private static RepositoryInvoker getInvokerFor(Object repository) { RepositoryMetadata metadata = new DefaultRepositoryMetadata(repository.getClass().getInterfaces()[0]);