diff --git a/.mvn/jvm.config b/.mvn/jvm.config
new file mode 100644
index 00000000..32599cef
--- /dev/null
+++ b/.mvn/jvm.config
@@ -0,0 +1,10 @@
+--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED
+--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED
+--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED
+--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED
diff --git a/pom.xml b/pom.xml
index 2f79fad4..95ed70b8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-keyvalue
- 4.0.0-SNAPSHOT
+ 4.0.x-GH-618-SNAPSHOT
Spring Data KeyValue
@@ -45,7 +45,6 @@
${querydsl}
true
-
diff --git a/src/main/java/org/springframework/data/keyvalue/annotation/package-info.java b/src/main/java/org/springframework/data/keyvalue/annotation/package-info.java
index e4994ad6..acad4dc7 100644
--- a/src/main/java/org/springframework/data/keyvalue/annotation/package-info.java
+++ b/src/main/java/org/springframework/data/keyvalue/annotation/package-info.java
@@ -1,6 +1,5 @@
/**
* Key-Value annotations for declarative keyspace configuration.
*/
-@org.springframework.lang.NonNullApi
-@org.springframework.lang.NonNullFields
+@org.jspecify.annotations.NullMarked
package org.springframework.data.keyvalue.annotation;
diff --git a/src/main/java/org/springframework/data/keyvalue/aot/KeyValueRuntimeHints.java b/src/main/java/org/springframework/data/keyvalue/aot/KeyValueRuntimeHints.java
index b4417b3f..8959193a 100644
--- a/src/main/java/org/springframework/data/keyvalue/aot/KeyValueRuntimeHints.java
+++ b/src/main/java/org/springframework/data/keyvalue/aot/KeyValueRuntimeHints.java
@@ -18,13 +18,13 @@
import java.util.Arrays;
import java.util.List;
+import org.jspecify.annotations.Nullable;
import org.springframework.aot.hint.ExecutableMode;
import org.springframework.aot.hint.MemberCategory;
import org.springframework.aot.hint.RuntimeHints;
import org.springframework.aot.hint.RuntimeHintsRegistrar;
import org.springframework.aot.hint.TypeReference;
import org.springframework.data.keyvalue.repository.query.KeyValuePartTreeQuery;
-import org.springframework.lang.Nullable;
/**
* {@link RuntimeHintsRegistrar} for KeyValue.
diff --git a/src/main/java/org/springframework/data/keyvalue/aot/package-info.java b/src/main/java/org/springframework/data/keyvalue/aot/package-info.java
new file mode 100644
index 00000000..199fb4ae
--- /dev/null
+++ b/src/main/java/org/springframework/data/keyvalue/aot/package-info.java
@@ -0,0 +1,5 @@
+/**
+ * Support classes for key-value ahead of time computation
+ */
+@org.jspecify.annotations.NullMarked
+package org.springframework.data.keyvalue.aot;
diff --git a/src/main/java/org/springframework/data/keyvalue/core/AbstractKeyValueAdapter.java b/src/main/java/org/springframework/data/keyvalue/core/AbstractKeyValueAdapter.java
index 80868a88..d64e226f 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/AbstractKeyValueAdapter.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/AbstractKeyValueAdapter.java
@@ -18,8 +18,8 @@
import java.util.Collection;
import java.util.Comparator;
+import org.jspecify.annotations.Nullable;
import org.springframework.data.keyvalue.core.query.KeyValueQuery;
-import org.springframework.lang.Nullable;
/**
* Base implementation of {@link KeyValueAdapter} holds {@link QueryEngine} to delegate {@literal find} and
@@ -69,15 +69,13 @@ protected AbstractKeyValueAdapter(@Nullable QueryEngine extends KeyValueAdapte
return engine;
}
- @Nullable
@Override
- public T get(Object id, String keyspace, Class type) {
+ public @Nullable T get(Object id, String keyspace, Class type) {
return type.cast(get(id, keyspace));
}
- @Nullable
@Override
- public T delete(Object id, String keyspace, Class type) {
+ public @Nullable T delete(Object id, String keyspace, Class type) {
return type.cast(delete(id, keyspace));
}
diff --git a/src/main/java/org/springframework/data/keyvalue/core/CriteriaAccessor.java b/src/main/java/org/springframework/data/keyvalue/core/CriteriaAccessor.java
index d50c6268..2e226de6 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/CriteriaAccessor.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/CriteriaAccessor.java
@@ -15,8 +15,8 @@
*/
package org.springframework.data.keyvalue.core;
+import org.jspecify.annotations.Nullable;
import org.springframework.data.keyvalue.core.query.KeyValueQuery;
-import org.springframework.lang.Nullable;
/**
* Resolves the criteria object from given {@link KeyValueQuery}.
diff --git a/src/main/java/org/springframework/data/keyvalue/core/ForwardingCloseableIterator.java b/src/main/java/org/springframework/data/keyvalue/core/ForwardingCloseableIterator.java
index 3867d74f..4a3a89f1 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/ForwardingCloseableIterator.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/ForwardingCloseableIterator.java
@@ -17,8 +17,8 @@
import java.util.Iterator;
+import org.jspecify.annotations.Nullable;
import org.springframework.data.util.CloseableIterator;
-import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
/**
diff --git a/src/main/java/org/springframework/data/keyvalue/core/GeneratingIdAccessor.java b/src/main/java/org/springframework/data/keyvalue/core/GeneratingIdAccessor.java
index 46a07ac2..d4ccc687 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/GeneratingIdAccessor.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/GeneratingIdAccessor.java
@@ -15,6 +15,7 @@
*/
package org.springframework.data.keyvalue.core;
+import org.jspecify.annotations.Nullable;
import org.springframework.data.mapping.IdentifierAccessor;
import org.springframework.data.mapping.PersistentProperty;
import org.springframework.data.mapping.PersistentPropertyAccessor;
@@ -55,7 +56,7 @@ class GeneratingIdAccessor implements IdentifierAccessor {
}
@Override
- public Object getIdentifier() {
+ public @Nullable Object getIdentifier() {
return accessor.getProperty(identifierProperty);
}
diff --git a/src/main/java/org/springframework/data/keyvalue/core/IterableConverter.java b/src/main/java/org/springframework/data/keyvalue/core/IterableConverter.java
index 23527ebd..5a32b3d4 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/IterableConverter.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/IterableConverter.java
@@ -20,6 +20,9 @@
import java.util.Collections;
import java.util.List;
+import org.jspecify.annotations.Nullable;
+import org.springframework.lang.Contract;
+
/**
* Converter capable of transforming a given {@link Iterable} into a collection type.
*
@@ -36,7 +39,12 @@ private IterableConverter() {}
* @param source
* @return {@link Collections#emptyList()} when source is {@literal null}.
*/
- public static List toList(Iterable source) {
+ @Contract("_ -> !null")
+ public static List toList(@Nullable Iterable source) {
+
+ if(source == null) {
+ return Collections.emptyList();
+ }
if (source instanceof List) {
return (List) source;
diff --git a/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java b/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java
index f3eaf1d1..e4848309 100644
--- a/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java
+++ b/src/main/java/org/springframework/data/keyvalue/core/KeyValueAdapter.java
@@ -18,10 +18,10 @@
import java.util.Collection;
import java.util.Map;
+import org.jspecify.annotations.Nullable;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.data.keyvalue.core.query.KeyValueQuery;
import org.springframework.data.util.CloseableIterator;
-import org.springframework.lang.Nullable;
/**
* {@link KeyValueAdapter} unifies access and shields the underlying key/value specific implementation.
@@ -39,7 +39,7 @@ public interface KeyValueAdapter extends DisposableBean {
* @param keyspace must not be {@literal null}.
* @return the item previously associated with the id.
*/
- Object put(Object id, Object item, String keyspace);
+ @Nullable Object put(Object id, Object item, String keyspace);
/**
* Check if a object with given id exists in keyspace.
@@ -69,8 +69,7 @@ public interface KeyValueAdapter extends DisposableBean {
* @return {@literal null} in case no matching item exists.
* @since 1.1
*/
- @Nullable
- T get(Object id, String keyspace, Class type);
+ @Nullable T get(Object id, String keyspace, Class type);
/**
* Delete and return the object with given type and id.
@@ -91,8 +90,7 @@ public interface KeyValueAdapter extends DisposableBean {
* @return {@literal null} if object could not be found
* @since 1.1
*/
- @Nullable
- T delete(Object id, String keyspace, Class type);
+ @Nullable T delete(Object id, String keyspace, Class type);
/**
* Get all elements for given keyspace.
@@ -100,7 +98,7 @@ public interface KeyValueAdapter extends DisposableBean {
* @param keyspace must not be {@literal null}.
* @return empty {@link Collection} if nothing found.
*/
- Iterable> getAllOf(String keyspace);
+ Iterable