From bde7e0a10127153d8977b0d321874cdee4939c59 Mon Sep 17 00:00:00 2001 From: xumengqi <2663479778@qq.com> Date: Wed, 1 Jan 2025 11:06:49 +0800 Subject: [PATCH 1/3] Support handling multidimensional arrays --- .../AbstractNestablePropertyAccessor.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index 17bcbf39b223..d43072cd6e76 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -893,16 +893,7 @@ private PropertyValue createDefaultPropertyValue(PropertyTokenHolder tokens) { private Object newValue(Class type, @Nullable TypeDescriptor desc, String name) { try { if (type.isArray()) { - Class componentType = type.componentType(); - // TODO - only handles 2-dimensional arrays - if (componentType.isArray()) { - Object array = Array.newInstance(componentType, 1); - Array.set(array, 0, Array.newInstance(componentType.componentType(), 0)); - return array; - } - else { - return Array.newInstance(componentType, 0); - } + return createArray(type); } else if (Collection.class.isAssignableFrom(type)) { TypeDescriptor elementDesc = (desc != null ? desc.getElementTypeDescriptor() : null); @@ -926,6 +917,28 @@ else if (Map.class.isAssignableFrom(type)) { } } + /** + * Create the array for the given array type. + * + * @param arrayType the desired type of the target array + * @return a new array instance + */ + private Object createArray(Class arrayType) { + Assert.notNull(arrayType, "Array type must not be null"); + if (arrayType.isArray()) { + Class componentType = arrayType.componentType(); + if (componentType.isArray()) { + Object array = Array.newInstance(componentType, 1); + Array.set(array, 0, createArray(componentType)); + return array; + } else { + return Array.newInstance(componentType, 0); + } + } else { + throw new IllegalArgumentException("Unsupported Array type: " + arrayType.getName()); + } + } + /** * Parse the given property name into the corresponding property name tokens. * @param propertyName the property name to parse From 0796397b447e53597322c536ecc22f3991100a38 Mon Sep 17 00:00:00 2001 From: xumengqi <2663479778@qq.com> Date: Wed, 1 Jan 2025 11:34:58 +0800 Subject: [PATCH 2/3] Fix code style --- .../beans/AbstractNestablePropertyAccessor.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java index d43072cd6e76..9a3839db953e 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -919,7 +919,6 @@ else if (Map.class.isAssignableFrom(type)) { /** * Create the array for the given array type. - * * @param arrayType the desired type of the target array * @return a new array instance */ @@ -931,10 +930,12 @@ private Object createArray(Class arrayType) { Object array = Array.newInstance(componentType, 1); Array.set(array, 0, createArray(componentType)); return array; - } else { + } + else { return Array.newInstance(componentType, 0); } - } else { + } + else { throw new IllegalArgumentException("Unsupported Array type: " + arrayType.getName()); } } From 5b3f282017dd2d8f101de1731848415ccc81fe8b Mon Sep 17 00:00:00 2001 From: xumengqi <2663479778@qq.com> Date: Wed, 1 Jan 2025 20:59:58 +0800 Subject: [PATCH 3/3] Add test case for list of three dimensional array, default 3-dimensional array should be [[[]]] --- .../beans/BeanWrapperAutoGrowingTests.java | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperAutoGrowingTests.java b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperAutoGrowingTests.java index 825ff1988a12..99ca349a6a7b 100644 --- a/spring-beans/src/test/java/org/springframework/beans/BeanWrapperAutoGrowingTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/BeanWrapperAutoGrowingTests.java @@ -103,6 +103,27 @@ void getPropertyValueAutoGrow3dArray() { assertThat(bean.getThreeDimensionalArray()[1][2][3]).isInstanceOf(Bean.class); } + @Test + void getPropertyValueAutoGrow3dArrayList() { + assertThat(wrapper.getPropertyValue("threeDimensionalArrayList[1][2][3][4]")).isNotNull(); + assertThat(bean.getThreeDimensionalArrayList()).hasSize(2); + assertThat(bean.getThreeDimensionalArrayList().get(1)).hasNumberOfRows(3); + assertThat(bean.getThreeDimensionalArrayList().get(1)[2]).hasNumberOfRows(4); + assertThat(bean.getThreeDimensionalArrayList().get(1)[2][3]).hasSize(5); + assertThat(bean.getThreeDimensionalArrayList().get(1)[2][3][4]).isInstanceOf(Bean.class); + } + + @Test + void getPropertyValueAutoGrow3dArrayListForDefault3dArray() { + assertThat(wrapper.getPropertyValue("threeDimensionalArrayList[0]")).isNotNull(); + assertThat(bean.getThreeDimensionalArrayList()).hasSize(1); + + // Default 3-dimensional array should be [[[]]] + assertThat(bean.getThreeDimensionalArrayList().get(0)).hasNumberOfRows(1); + assertThat(bean.getThreeDimensionalArrayList().get(0)[0]).hasNumberOfRows(1); + assertThat(bean.getThreeDimensionalArrayList().get(0)[0][0]).isEmpty(); + } + @Test void setPropertyValueAutoGrow2dArray() { Bean newBean = new Bean(); @@ -123,6 +144,16 @@ void setPropertyValueAutoGrow3dArray() { .extracting(Bean::getProp).isEqualTo("enigma"); } + @Test + void setPropertyValueAutoGrow3dArrayList() { + Bean newBean = new Bean(); + newBean.setProp("enigma"); + wrapper.setPropertyValue("threeDimensionalArrayList[0][1][2][3]", newBean); + assertThat(bean.getThreeDimensionalArrayList().get(0)[1][2][3]) + .isInstanceOf(Bean.class) + .extracting(Bean::getProp).isEqualTo("enigma"); + } + @Test void getPropertyValueAutoGrowList() { assertThat(wrapper.getPropertyValue("list[0]")).isNotNull(); @@ -215,6 +246,8 @@ public static class Bean { private Bean[][][] threeDimensionalArray; + private List threeDimensionalArrayList; + private List list; private List> nestedList; @@ -269,6 +302,14 @@ public void setThreeDimensionalArray(Bean[][][] threeDimensionalArray) { this.threeDimensionalArray = threeDimensionalArray; } + public List getThreeDimensionalArrayList() { + return threeDimensionalArrayList; + } + + public void setThreeDimensionalArrayList(List threeDimensionalArrayList) { + this.threeDimensionalArrayList = threeDimensionalArrayList; + } + public List getList() { return list; }