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 62bbcd969..35d2c796f 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -257,6 +257,7 @@ public abstract class QueryExecutionConverters { } conversionService.addConverter(new NullableWrapperToFutureConverter(conversionService)); + conversionService.addConverter(IterableToStreamableConverter.INSTANCE); } /** @@ -697,6 +698,21 @@ public abstract class QueryExecutionConverters { } } + private static enum IterableToStreamableConverter implements Converter, Streamable> { + + INSTANCE; + + /* + * (non-Javadoc) + * @see org.springframework.core.convert.converter.Converter#convert(java.lang.Object) + */ + @Nonnull + @Override + public Streamable convert(Iterable source) { + return Streamable.of(source); + } + } + @Value @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public static class WrapperType { diff --git a/src/test/java/org/springframework/data/repository/core/support/QueryExecutionResultHandlerUnitTests.java b/src/test/java/org/springframework/data/repository/core/support/QueryExecutionResultHandlerUnitTests.java index 8a7da8025..c615ea3a7 100755 --- a/src/test/java/org/springframework/data/repository/core/support/QueryExecutionResultHandlerUnitTests.java +++ b/src/test/java/org/springframework/data/repository/core/support/QueryExecutionResultHandlerUnitTests.java @@ -25,11 +25,13 @@ import rx.Observable; import rx.Single; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.junit.Test; import org.reactivestreams.Publisher; @@ -37,6 +39,7 @@ import org.springframework.core.MethodParameter; import org.springframework.core.convert.TypeDescriptor; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.repository.Repository; +import org.springframework.data.util.Streamable; /** * Unit tests for {@link QueryExecutionResultHandler}. @@ -348,6 +351,18 @@ public class QueryExecutionResultHandlerUnitTests { assertThat(result).isInstanceOfSatisfying(Option.class, it -> assertThat(it.get()).isEqualTo(value)); } + @Test // DATACMNS-1165 + @SuppressWarnings("unchecked") + public void convertsIterableIntoStreamable() { + + Iterable source = Arrays.asList(new Object()); + + Object result = handler.postProcessInvocationResult(source, TypeDescriptor.valueOf(Streamable.class)); + + assertThat(result).isInstanceOfSatisfying(Streamable.class, + it -> assertThat(it.stream().collect(Collectors.toList())).isEqualTo(source)); + } + private static TypeDescriptor getTypeDescriptorFor(String methodName) throws Exception { Method method = Sample.class.getMethod(methodName);