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 d4675d2c032..3912156671b 100644 --- a/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/AbstractNestablePropertyAccessor.java @@ -956,8 +956,8 @@ public abstract class AbstractNestablePropertyAccessor extends AbstractPropertyA actualName = propertyName.substring(0, keyStart); } String key = propertyName.substring(keyStart + PROPERTY_KEY_PREFIX.length(), keyEnd); - if (key.length() > 1 && (key.startsWith("'") && key.endsWith("'")) || - (key.startsWith("\"") && key.endsWith("\""))) { + if (key.length() > 1 && ((key.startsWith("'") && key.endsWith("'")) || + (key.startsWith("\"") && key.endsWith("\"")))) { key = key.substring(1, key.length() - 1); } keys.add(key); diff --git a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessorUtils.java b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessorUtils.java index 4a14b85ca4b..f527f83bd93 100644 --- a/spring-beans/src/main/java/org/springframework/beans/PropertyAccessorUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/PropertyAccessorUtils.java @@ -154,7 +154,8 @@ public abstract class PropertyAccessorUtils { PropertyAccessor.PROPERTY_KEY_SUFFIX, keyStart + PropertyAccessor.PROPERTY_KEY_PREFIX.length()); if (keyEnd != -1) { String key = sb.substring(keyStart + PropertyAccessor.PROPERTY_KEY_PREFIX.length(), keyEnd); - if ((key.startsWith("'") && key.endsWith("'")) || (key.startsWith("\"") && key.endsWith("\""))) { + if (key.length() > 1 && ((key.startsWith("'") && key.endsWith("'")) || + (key.startsWith("\"") && key.endsWith("\"")))) { sb.delete(keyStart + 1, keyStart + 2); sb.delete(keyEnd - 2, keyEnd - 1); keyEnd = keyEnd - 2; diff --git a/spring-beans/src/test/java/org/springframework/beans/AbstractPropertyAccessorTests.java b/spring-beans/src/test/java/org/springframework/beans/AbstractPropertyAccessorTests.java index 3bb83600abb..e6a17ddd2c5 100644 --- a/spring-beans/src/test/java/org/springframework/beans/AbstractPropertyAccessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/AbstractPropertyAccessorTests.java @@ -1413,6 +1413,8 @@ abstract class AbstractPropertyAccessorTests { assertThat(accessor.getPropertyValue("map[key5[foo]].name")).isEqualTo("name8"); assertThat(accessor.getPropertyValue("map['key5[foo]'].name")).isEqualTo("name8"); assertThat(accessor.getPropertyValue("map[\"key5[foo]\"].name")).isEqualTo("name8"); + assertThat(accessor.getPropertyValue("map['].name")).isEqualTo("name9"); + assertThat(accessor.getPropertyValue("map[\"].name")).isEqualTo("name9"); assertThat(accessor.getPropertyValue("iterableMap[key1].name")).isEqualTo("nameC"); assertThat(accessor.getPropertyValue("iterableMap[key2][0].name")).isEqualTo("nameA"); assertThat(accessor.getPropertyValue("iterableMap[key2][1].name")).isEqualTo("nameB"); diff --git a/spring-beans/src/test/java/org/springframework/beans/PropertyAccessorUtilsTests.java b/spring-beans/src/test/java/org/springframework/beans/PropertyAccessorUtilsTests.java index 012aa731eb8..0af975de003 100644 --- a/spring-beans/src/test/java/org/springframework/beans/PropertyAccessorUtilsTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/PropertyAccessorUtilsTests.java @@ -79,6 +79,10 @@ class PropertyAccessorUtilsTests { assertThat(PropertyAccessorUtils.canonicalPropertyName("map[key1].name")).isEqualTo("map[key1].name"); assertThat(PropertyAccessorUtils.canonicalPropertyName("map['key1'].name")).isEqualTo("map[key1].name"); assertThat(PropertyAccessorUtils.canonicalPropertyName("map[\"key1\"].name")).isEqualTo("map[key1].name"); + assertThat(PropertyAccessorUtils.canonicalPropertyName("map['key1]")).isEqualTo("map['key1]"); + assertThat(PropertyAccessorUtils.canonicalPropertyName("map[\"key1]")).isEqualTo("map[\"key1]"); + assertThat(PropertyAccessorUtils.canonicalPropertyName("map[']")).isEqualTo("map[']"); + assertThat(PropertyAccessorUtils.canonicalPropertyName("map[\"]")).isEqualTo("map[\"]"); } @Test diff --git a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/IndexedTestBean.java b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/IndexedTestBean.java index 5de9303787d..ffcfa287e5b 100644 --- a/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/IndexedTestBean.java +++ b/spring-beans/src/testFixtures/java/org/springframework/beans/testfixture/beans/IndexedTestBean.java @@ -76,6 +76,7 @@ public class IndexedTestBean { TestBean tb6 = new TestBean("name6", 0); TestBean tb7 = new TestBean("name7", 0); TestBean tb8 = new TestBean("name8", 0); + TestBean tb9 = new TestBean("name9", 0); TestBean tbA = new TestBean("nameA", 0); TestBean tbB = new TestBean("nameB", 0); TestBean tbC = new TestBean("nameC", 0); @@ -104,6 +105,8 @@ public class IndexedTestBean { list.add(tbY); this.map.put("key4", list); this.map.put("key5[foo]", tb8); + this.map.put("'", tb9); + this.map.put("\"", tb9); this.myTestBeans = new MyTestBeans(tbZ); }