From dd0848b1866696d7145ffba40fda4a3abd6d05ab Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Thu, 21 Feb 2019 00:17:29 +0100 Subject: [PATCH] DATACMNS-1484 - Fixed too aggressive conversion to Streamable in IterableToStreamableConverter. We now explicitly check for the target type to be assignable to Streamable to opt into conversion. Without that check, every collection returned from a method declaring Iterable as return type would've been converted into a Streamable by accident. Related ticket: DATACMNS-1430. --- .../data/repository/util/QueryExecutionConverters.java | 4 ++++ .../util/QueryExecutionConvertersUnitTests.java | 9 +++++++++ 2 files changed, 13 insertions(+) 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 680355093..bb038bc45 100644 --- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java +++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java @@ -699,6 +699,10 @@ public abstract class QueryExecutionConverters { @Override public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) { + if (sourceType.isAssignableTo(targetType)) { + return false; + } + if (!Iterable.class.isAssignableFrom(sourceType.getType())) { return false; } 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 4c8dc2825..61db08297 100755 --- a/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java +++ b/src/test/java/org/springframework/data/repository/util/QueryExecutionConvertersUnitTests.java @@ -355,6 +355,15 @@ public class QueryExecutionConvertersUnitTests { .containsExactly("foo"); } + @Test // DATACMNS-1484 + public void doesNotConvertCollectionToStreamableIfReturnTypeIsIterable() { + + List source = Arrays.asList("1", "2"); + + assertThat(conversionService.convert(source, Iterable.class)).isSameAs(source); + + } + interface Sample { Page pages();