diff --git a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java index 63f01a355..352bcd414 100644 --- a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java +++ b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java @@ -30,6 +30,7 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.function.Predicate; import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -61,6 +62,7 @@ import org.springframework.data.spel.EvaluationContextProvider; import org.springframework.data.spel.ExtensionAwareEvaluationContextProvider; import org.springframework.data.util.ClassTypeInformation; import org.springframework.data.util.KotlinReflectionUtils; +import org.springframework.data.util.NullableWrapperConverters; import org.springframework.data.util.Optionals; import org.springframework.data.util.Streamable; import org.springframework.data.util.TypeInformation; @@ -483,6 +485,9 @@ public abstract class AbstractMappingContext { + if(it.isNullableWrapper()) { + return it.getActualType(); + } + return it; + }) + .filter(it -> { + + boolean shouldCreate = AbstractMappingContext.this.shouldCreatePersistentEntityFor(it); + return shouldCreate; + }) + .forEach(AbstractMappingContext.this::addPersistentEntity); } protected boolean shouldSkipOverrideProperty(P property) { diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 6ce897ac4..141249f42 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -309,6 +309,10 @@ class TypeDiscoverer implements TypeInformation { return getComponentType(); } + if (isNullableWrapper()) { + return getComponentType(); + } + return this; } @@ -384,6 +388,10 @@ class TypeDiscoverer implements TypeInformation { return getTypeArgument(Iterable.class, 0); } + if(isNullableWrapper()) { + return getTypeArgument(rawType, 0); + } + List> arguments = getTypeArguments(); return arguments.size() > 0 ? arguments.get(0) : null; diff --git a/src/main/java/org/springframework/data/util/TypeInformation.java b/src/main/java/org/springframework/data/util/TypeInformation.java index 014ffad0e..2db2b5c91 100644 --- a/src/main/java/org/springframework/data/util/TypeInformation.java +++ b/src/main/java/org/springframework/data/util/TypeInformation.java @@ -273,4 +273,9 @@ public interface TypeInformation { default boolean isSubTypeOf(Class type) { return !type.equals(getType()) && type.isAssignableFrom(getType()); } + + default boolean isNullableWrapper() { + return NullableWrapperConverters.supports(getType()); + } + }