diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentPropertySource.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentPropertySource.java index 00a47c28..d1e91bf8 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentPropertySource.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/support/EnvironmentPropertySource.java @@ -1,6 +1,7 @@ package org.springframework.cloud.config.server.support; import java.util.Map; +import java.util.regex.Pattern; import org.springframework.cloud.config.environment.Environment; import org.springframework.core.env.PropertySource; @@ -22,11 +23,14 @@ public class EnvironmentPropertySource extends PropertySource { return standardEnvironment; } + // "\${" (from text) or "\\${" from JSON to signal escaped placeholder + private static final Pattern ESCAPED_PLACEHOLDERS = Pattern.compile("[\\\\]{1,2}\\$\\{"); + public static String resolvePlaceholders(StandardEnvironment preparedEnvironment, String text) { - // Mask out escaped placeholders - text = text.replace("\\${", "$_{"); - return preparedEnvironment.resolvePlaceholders(text).replace("$_{", "${"); + // Mask out escaped placeholders + text = ESCAPED_PLACEHOLDERS.matcher(text).replaceAll("\\$_{"); + return preparedEnvironment.resolvePlaceholders(text).replace("$_{", "${"); } public EnvironmentPropertySource(Environment sources) { diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/EnvironmentPropertySourceTest.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/EnvironmentPropertySourceTest.java new file mode 100644 index 00000000..58cc5211 --- /dev/null +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/support/EnvironmentPropertySourceTest.java @@ -0,0 +1,18 @@ +package org.springframework.cloud.config.server.support; + +import static org.junit.Assert.assertEquals; +import static org.springframework.cloud.config.server.support.EnvironmentPropertySource.resolvePlaceholders; + +import org.junit.Test; +import org.springframework.core.env.StandardEnvironment; + +public class EnvironmentPropertySourceTest { + private final StandardEnvironment env = new StandardEnvironment(); + + @Test + public void testEscapedPlaceholdersRemoved() { + assertEquals("${abc}", resolvePlaceholders(env, "\\${abc}")); + // JSON generated from jackson will be double escaped + assertEquals("${abc}", resolvePlaceholders(env, "\\\\${abc}")); + } +}