diff --git a/pom.xml b/pom.xml
index 1db9b70eb..5a7ea733b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,6 @@
org.springframework.data
spring-data-commons
- 2.0.0.BUILD-SNAPSHOT
Spring Data Core
@@ -17,6 +16,7 @@
2.0.4
+ 0.9.0
2.11.7
1.4.8
@@ -175,6 +175,12 @@
${javaslang}
true
+
+ io.vavr
+ vavr
+ ${vavr}
+ true
+
javax.el
diff --git a/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java b/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java
index 85631d63d..a012be42b 100644
--- a/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java
+++ b/src/main/java/org/springframework/data/repository/util/JavaslangCollections.java
@@ -67,7 +67,7 @@ class JavaslangCollections {
return ((javaslang.collection.Set>) source).toJavaSet();
}
- throw new IllegalArgumentException("Unsupported Javaslang collection " + source);
+ throw new IllegalArgumentException("Unsupported Javaslang collection " + source.getClass());
}
}
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 a4594358d..50fb5d486 100644
--- a/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java
+++ b/src/main/java/org/springframework/data/repository/util/QueryExecutionConverters.java
@@ -64,6 +64,7 @@ import com.google.common.base.Optional;
* {@code javaslang.control.Option} - as of 1.13
* {@code javaslang.collection.Seq}, {@code javaslang.collection.Map}, {@code javaslang.collection.Set} - as of
* 1.13
+ * {@code io.vavr.collection.Seq}, {@code io.vavr.collection.Map}, {@code io.vavr.collection.Set} - as of 2.0
* Reactive wrappers supported by {@link ReactiveWrappers} - as of 2.0
*
*
@@ -84,6 +85,8 @@ public abstract class QueryExecutionConverters {
QueryExecutionConverters.class.getClassLoader());
private static final boolean JAVASLANG_PRESENT = ClassUtils.isPresent("javaslang.control.Option",
QueryExecutionConverters.class.getClassLoader());
+ private static final boolean VAVR_PRESENT = ClassUtils.isPresent("io.vavr.control.Option",
+ QueryExecutionConverters.class.getClassLoader());
private static final Set WRAPPER_TYPES = new HashSet();
private static final Set UNWRAPPER_TYPES = new HashSet();
@@ -134,6 +137,16 @@ public abstract class QueryExecutionConverters {
ALLOWED_PAGEABLE_TYPES.add(Seq.class);
}
+ if (VAVR_PRESENT) {
+
+ WRAPPER_TYPES.add(NullableWrapperToVavrOptionConverter.getWrapperType());
+ WRAPPER_TYPES.add(VavrCollections.ToJavaConverter.INSTANCE.getWrapperType());
+
+ UNWRAPPERS.add(VavrOptionUnwrapper.INSTANCE);
+
+ ALLOWED_PAGEABLE_TYPES.add(io.vavr.collection.Seq.class);
+ }
+
if (ReactiveWrappers.isAvailable()) {
WRAPPER_TYPES
.addAll(ReactiveWrappers.getNoValueTypes().stream().map(WrapperType::noValue).collect(Collectors.toList()));
@@ -234,6 +247,11 @@ public abstract class QueryExecutionConverters {
conversionService.addConverter(JavaslangCollections.FromJavaConverter.INSTANCE);
}
+ if (VAVR_PRESENT) {
+ conversionService.addConverter(new NullableWrapperToVavrOptionConverter(conversionService));
+ conversionService.addConverter(VavrCollections.FromJavaConverter.INSTANCE);
+ }
+
conversionService.addConverter(new NullableWrapperToFutureConverter(conversionService));
}
@@ -498,6 +516,37 @@ public abstract class QueryExecutionConverters {
}
}
+ /**
+ * Converter to convert from {@link NullableWrapper} into JavaSlang's {@link io.vavr.control.Option}.
+ *
+ * @author Oliver Gierke
+ * @since 2.0
+ */
+ private static class NullableWrapperToVavrOptionConverter extends AbstractWrapperTypeConverter {
+
+ /**
+ * Creates a new {@link NullableWrapperToJavaslangOptionConverter} using the given {@link ConversionService}.
+ *
+ * @param conversionService must not be {@literal null}.
+ */
+ public NullableWrapperToVavrOptionConverter(ConversionService conversionService) {
+ super(conversionService, io.vavr.control.Option.none(), Collections.singleton(io.vavr.control.Option.class));
+ }
+
+ public static WrapperType getWrapperType() {
+ return WrapperType.singleValue(io.vavr.control.Option.class);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.repository.util.QueryExecutionConverters.AbstractWrapperTypeConverter#wrap(java.lang.Object)
+ */
+ @Override
+ protected Object wrap(Object source) {
+ return io.vavr.control.Option.of(source);
+ }
+ }
+
/**
* A {@link Converter} to unwrap Guava {@link Optional} instances.
*
@@ -601,6 +650,36 @@ public abstract class QueryExecutionConverters {
}
}
+ /**
+ * Converter to unwrap Vavr {@link io.vavr.control.Option} instances.
+ *
+ * @author Oliver Gierke
+ * @since 2.0
+ */
+ private static enum VavrOptionUnwrapper implements Converter