diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 0bef50792c..0803aadab9 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -52,10 +52,12 @@ * @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 { @@ -69,6 +71,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; @@ -369,8 +384,21 @@ public boolean isCollectionLike() { 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; } /* diff --git a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java index d0a9dd8f29..9772a5735e 100755 --- a/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java +++ b/src/test/java/org/springframework/data/util/TypeDiscovererUnitTests.java @@ -38,6 +38,7 @@ * Unit tests for {@link TypeDiscoverer}. * * @author Oliver Gierke + * @author Jürgen Diez */ @ExtendWith(MockitoExtension.class) public class TypeDiscovererUnitTests { @@ -179,6 +180,38 @@ void detectsSubTypes() { 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;