diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java index 96ce40db01a1..47300fc5f7b0 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java @@ -247,7 +247,8 @@ private Map asMap(Object object) { value = asMap(value); } if (key instanceof CharSequence) { - result.put(key.toString(), value); + String keyString = key.toString(); + result.put((keyString.startsWith("[") ? "[" + keyString + "]" : keyString), value); } else { // It has to be a map key in this case diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/config/YamlPropertiesFactoryBeanTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/config/YamlPropertiesFactoryBeanTests.java index b8874a13766e..35cff117659f 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/config/YamlPropertiesFactoryBeanTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/config/YamlPropertiesFactoryBeanTests.java @@ -226,6 +226,21 @@ void loadArrayOfObject() { assertThat(properties.get("foo")).isNull(); } + @Test + void loadNestedMapWithBracketedKey() { + YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean(); + factory.setResources(new ByteArrayResource(""" + root: + webservices: + "[domain.test:8080]": + - username: me + password: mypassword + """.getBytes())); + Properties properties = factory.getObject(); + assertThat(properties.getProperty("root.webservices[[domain.test:8080]][0].username")).isEqualTo("me"); + assertThat(properties.getProperty("root.webservices[[domain.test:8080]][0].password")).isEqualTo("mypassword"); + } + @Test @SuppressWarnings("unchecked") void yaml() {