diff --git a/docs/src/main/asciidoc/spring-cloud-config.adoc b/docs/src/main/asciidoc/spring-cloud-config.adoc index 3c498ee4..378b11f3 100644 --- a/docs/src/main/asciidoc/spring-cloud-config.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config.adoc @@ -891,6 +891,8 @@ The database needs to have a table called `PROPERTIES` with columns called `APPL All fields are of type String in Java, so you can make them `VARCHAR` of whatever length you need. Property values behave in the same way as they would if they came from Spring Boot properties files named `{application}-{profile}.properties`, including all the encryption and decryption, which will be applied as post-processing steps (that is, not in the repository implementation directly). +NOTE: The default label used for JDBC is `master`. You can change that by setting `spring.cloud.config.server.jdbc.defaultLabel`. + ==== Redis Backend Spring Cloud Config Server supports Redis as a backend for configuration properties. diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentProperties.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentProperties.java index 3ab148c3..16079d4f 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentProperties.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentProperties.java @@ -51,6 +51,8 @@ public class JdbcEnvironmentProperties implements EnvironmentRepositoryPropertie */ private boolean failOnError = true; + private String defaultLabel = "master"; + public boolean isEnabled() { return enabled; } @@ -97,4 +99,12 @@ public class JdbcEnvironmentProperties implements EnvironmentRepositoryPropertie return !this.sql.equals(DEFAULT_SQL) && this.sqlWithoutProfile.equals(DEFAULT_SQL_WITHOUT_PROFILE); } + public String getDefaultLabel() { + return this.defaultLabel; + } + + public void setDefaultLabel(String defaultLabel) { + this.defaultLabel = defaultLabel; + } + } diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepository.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepository.java index 2ce49be8..aaca7b4d 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepository.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepository.java @@ -69,6 +69,8 @@ public class JdbcEnvironmentRepository implements EnvironmentRepository, Ordered private boolean configIncomplete; + private String defaultLabel; + @Deprecated public JdbcEnvironmentRepository(JdbcTemplate jdbc, JdbcEnvironmentProperties properties) { this(jdbc, properties, new PropertiesResultSetExtractor()); @@ -83,6 +85,7 @@ public class JdbcEnvironmentRepository implements EnvironmentRepository, Ordered this.failOnError = properties.isFailOnError(); this.extractor = extractor; this.configIncomplete = properties.isConfigIncomplete(); + this.defaultLabel = properties.getDefaultLabel(); } public String getSql() { @@ -97,7 +100,7 @@ public class JdbcEnvironmentRepository implements EnvironmentRepository, Ordered public Environment findOne(String application, String profile, String label) { String config = application; if (StringUtils.isEmpty(label)) { - label = "master"; + label = this.defaultLabel; } if (!StringUtils.hasText(profile)) { profile = "default"; diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryTests.java index dc19a032..3c26b975 100644 --- a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryTests.java +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryTests.java @@ -207,6 +207,22 @@ public class JdbcEnvironmentRepositoryTests { assertThatThrownBy(() -> repository.findOne("foo", "bar", "")).isInstanceOf(DataAccessException.class); } + @Test + public void testCustomLabel() { + JdbcEnvironmentProperties properties = new JdbcEnvironmentProperties(); + properties.setDefaultLabel("main"); + Environment env = new JdbcEnvironmentRepository(new JdbcTemplate(this.dataSource), properties, + new JdbcEnvironmentRepository.PropertiesResultSetExtractor()).findOne("foo", "bar", ""); + assertThat(env.getName()).isEqualTo("foo"); + assertThat(env.getProfiles()).isEqualTo(new String[] { "bar" }); + assertThat(env.getLabel()).isEqualTo("main"); + assertThat(env.getPropertySources()).isNotEmpty(); + assertThat(env.getPropertySources().get(0).getName()).isEqualTo("foo-bar"); + assertThat(env.getPropertySources().get(0).getSource().get("a.b.c")).isEqualTo("foo-bar"); + assertThat(env.getPropertySources().get(1).getName()).isEqualTo("application-bar"); + assertThat(env.getPropertySources().get(1).getSource().get("a.b.c")).isEqualTo("application-bar"); + } + @ImportAutoConfiguration(SqlInitializationAutoConfiguration.class) @Configuration(proxyBeanMethods = false) protected static class ApplicationConfiguration { diff --git a/spring-cloud-config-server/src/test/resources/data-jdbc.sql b/spring-cloud-config-server/src/test/resources/data-jdbc.sql index 245eb367..e6dfb4f2 100644 --- a/spring-cloud-config-server/src/test/resources/data-jdbc.sql +++ b/spring-cloud-config-server/src/test/resources/data-jdbc.sql @@ -10,4 +10,7 @@ INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values ('foo', null, 'master', 'a.b.c', 'foo-null'); INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values ('application', 'bar', 'master', 'a.b.c', 'application-bar'); INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values ('application', 'default', 'master', 'a.b.c', 'application-default'); -INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values ('application', null, 'master', 'a.b.c', 'application-null'); \ No newline at end of file +INSERT into MY_PROPERTIES(APPLICATION, PROFILE, LABEL, MY_KEY, MY_VALUE) values ('application', null, 'master', 'a.b.c', 'application-null'); + +INSERT into PROPERTIES(APPLICATION, PROFILE, LABEL, "KEY", "VALUE") values ('foo', 'bar', 'main', 'a.b.c', 'foo-bar'); +INSERT into PROPERTIES(APPLICATION, PROFILE, LABEL, "KEY", "VALUE") values ('application', 'bar', 'main', 'a.b.c', 'application-bar');