diff --git a/spring-boot/src/main/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor.java b/spring-boot/src/main/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor.java index 0042d5c87be2..333f9dbaa92c 100644 --- a/spring-boot/src/main/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor.java +++ b/spring-boot/src/main/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessor.java @@ -16,6 +16,7 @@ package org.springframework.boot.env; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; @@ -116,15 +117,28 @@ private void flatten(String prefix, Map result, for (String key : map.keySet()) { String name = prefix + key; Object value = map.get(key); - if (value instanceof Map) { - @SuppressWarnings("unchecked") - Map nested = (Map) value; - flatten(name, result, nested); - } - else { - result.put(name, value); + extract(name, result, value); + } + } + + private void extract(String name, Map result, Object value) { + if (value instanceof Map) { + @SuppressWarnings("unchecked") + Map nested = (Map) value; + flatten(name, result, nested); + } + if (value instanceof Collection) { + @SuppressWarnings("unchecked") + Collection nested = (Collection) value; + int index = 0; + for (Object object : nested) { + extract(name + "[" + index + "]", result, object); + index++; } } + else { + result.put(name, value); + } } private String findPropertySource(MutablePropertySources sources) { diff --git a/spring-boot/src/test/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessorTests.java b/spring-boot/src/test/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessorTests.java index 9ce7c320cfab..59e755ededc1 100644 --- a/spring-boot/src/test/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessorTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/env/SpringApplicationJsonEnvironmentPostProcessorTests.java @@ -95,4 +95,22 @@ public void prefixed() { assertEquals("spam", this.environment.resolvePlaceholders("${foo.bar:}")); } + @Test + public void list() { + assertEquals("", this.environment.resolvePlaceholders("${foo[1]:}")); + EnvironmentTestUtils.addEnvironment(this.environment, + "SPRING_APPLICATION_JSON={\"foo\":[\"bar\",\"spam\"]}"); + this.processor.postProcessEnvironment(this.environment, null); + assertEquals("spam", this.environment.resolvePlaceholders("${foo[1]:}")); + } + + @Test + public void listOfObject() { + assertEquals("", this.environment.resolvePlaceholders("${foo[0].bar:}")); + EnvironmentTestUtils.addEnvironment(this.environment, + "SPRING_APPLICATION_JSON={\"foo\":[{\"bar\":\"spam\"}]}"); + this.processor.postProcessEnvironment(this.environment, null); + assertEquals("spam", this.environment.resolvePlaceholders("${foo[0].bar:}")); + } + }