From 5ed7156061b0d9f6d34cce63aad29498680b6574 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Sat, 31 Oct 2015 08:06:20 +0000 Subject: [PATCH] Add support for lists in SPRING_APPLICATION_JSON --- ...plicationJsonEnvironmentPostProcessor.java | 28 ++++++++++++++----- ...tionJsonEnvironmentPostProcessorTests.java | 18 ++++++++++++ 2 files changed, 39 insertions(+), 7 deletions(-) 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 0042d5c87be..333f9dbaa92 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 @@ public class SpringApplicationJsonEnvironmentPostProcessor 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 9ce7c320cfa..59e755ededc 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 class SpringApplicationJsonEnvironmentPostProcessorTests { 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:}")); + } + }