From aa4f09d080049d808abffff007457d83a9a61987 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Wed, 25 Oct 2023 11:38:55 +0100 Subject: [PATCH] Refine decision to create object for constructor injection Closes gh-31488 --- .../java/org/springframework/validation/DataBinder.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 6df605d46b..14df019fb0 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -22,6 +22,7 @@ import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -947,7 +948,7 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { Class paramType = paramTypes[i]; Object value = valueResolver.resolveValue(paramPath, paramType); - if (value == null && !BeanUtils.isSimpleValueType(param.nestedIfOptional().getNestedParameterType())) { + if (value == null && shouldCreateObject(param)) { ResolvableType type = ResolvableType.forMethodParameter(param); args[i] = createObject(type, paramPath + ".", valueResolver); } @@ -1007,6 +1008,12 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { return (isOptional && !nestedPath.isEmpty() ? Optional.ofNullable(result) : result); } + private static boolean shouldCreateObject(MethodParameter param) { + Class type = param.nestedIfOptional().getNestedParameterType(); + return !(BeanUtils.isSimpleValueType(type) || + Collection.class.isAssignableFrom(type) || Map.class.isAssignableFrom(type) || type.isArray()); + } + private void validateConstructorArgument( Class constructorClass, String nestedPath, String name, @Nullable Object value) {