From fe338de043b3b7c992b340eb00ef8cba6ef32603 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 23 Jun 2021 15:29:15 +0200 Subject: [PATCH] Don't create PersistentEntity for Nullable wrapper type. Original pull request: #2394. Closes #2390. --- .../context/AbstractMappingContext.java | 19 ++++++++++++++++++- .../data/util/TypeDiscoverer.java | 8 ++++++++ .../data/util/TypeInformation.java | 5 +++++ 3 files changed, 31 insertions(+), 1 deletion(-) 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 c06d3a924..0741f25df 100644 --- a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java +++ b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java @@ -29,6 +29,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.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; @@ -57,6 +58,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; @@ -482,6 +484,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); } } diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 133e2c728..a0d471a56 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 86a468296..d6f275227 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()); + } + }