diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index bfd5c3c69..065539c19 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -50,10 +50,12 @@ import org.springframework.util.ReflectionUtils; * @author Oliver Gierke * @author Christoph Strobl * @author Mark Paluch + * @author Jürgen Diez */ class TypeDiscoverer implements TypeInformation { private static final Class[] MAP_TYPES; + private static final Class[] COLLECTION_TYPES; static { @@ -67,6 +69,19 @@ class TypeDiscoverer implements TypeInformation { } catch (ClassNotFoundException o_O) {} MAP_TYPES = mapTypes.toArray(new Class[0]); + + Set> collectionTypes = new HashSet<>(); + collectionTypes.add(Collection.class); + + try { + collectionTypes.add(ClassUtils.forName("io.vavr.collection.Seq", classLoader)); + } catch (ClassNotFoundException o_O) {} + + try { + collectionTypes.add(ClassUtils.forName("io.vavr.collection.Set", classLoader)); + } catch (ClassNotFoundException o_O) {} + + COLLECTION_TYPES = collectionTypes.toArray(new Class[0]); } private final Type type; @@ -332,8 +347,21 @@ class TypeDiscoverer implements TypeInformation { return rawType.isArray() // || Iterable.class.equals(rawType) // - || Collection.class.isAssignableFrom(rawType) // - || Streamable.class.isAssignableFrom(rawType); + || Streamable.class.isAssignableFrom(rawType) + || isCollection(); + } + + private boolean isCollection() { + + Class type = getType(); + + for (Class collectionType : COLLECTION_TYPES) { + if (collectionType.isAssignableFrom(type)) { + return true; + } + } + + return false; } @Nullable diff --git a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java index 4f652b782..502cbff07 100755 --- a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java @@ -37,6 +37,7 @@ import org.mockito.junit.jupiter.MockitoExtension; * Unit tests for {@link TypeDiscoverer}. * * @author Oliver Gierke + * @author Jürgen Diez */ @ExtendWith(MockitoExtension.class) public class TypeDiscovererUnitTests { @@ -178,6 +179,38 @@ public class TypeDiscovererUnitTests { assertThat(type.isSubTypeOf(String.class)).isFalse(); } + @Test + void considerVavrMapToBeAMap() { + + TypeInformation type = from(io.vavr.collection.Map.class); + + assertThat(type.isMap()).isTrue(); + } + + @Test + void considerVavrSetToBeCollectionLike() { + + TypeInformation type = from(io.vavr.collection.Set.class); + + assertThat(type.isCollectionLike()).isTrue(); + } + + @Test + void considerVavrSeqToBeCollectionLike() { + + TypeInformation type = from(io.vavr.collection.Seq.class); + + assertThat(type.isCollectionLike()).isTrue(); + } + + @Test + void considerVavrListToBeCollectionLike() { + + TypeInformation type = from(io.vavr.collection.List.class); + + assertThat(type.isCollectionLike()).isTrue(); + } + class Person { Addresses addresses;