diff --git a/docs/src/main/asciidoc/spring-cloud-config.adoc b/docs/src/main/asciidoc/spring-cloud-config.adoc index 11cdba68..c5408264 100644 --- a/docs/src/main/asciidoc/spring-cloud-config.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config.adoc @@ -804,6 +804,8 @@ You can enable this feature by adding `spring-jdbc` to the classpath and using t If you include the right dependencies on the classpath (see the user guide for more details on that), Spring Boot configures a data source. // TODO Which user guide? When we know that, we should add a link to it. +You can disable autoconfiguration for `JdbcEnvironmentRepository` by setting the `spring.cloud.config.server.jdbc.enabled` property to `false`. + The database needs to have a table called `PROPERTIES` with columns called `APPLICATION`, `PROFILE`, and `LABEL` (with the usual `Environment` meaning), plus `KEY` and `VALUE` for the key and value pairs in `Properties` style. 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). diff --git a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java index 63bd7782..b70209bf 100644 --- a/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java +++ b/spring-cloud-config-server/src/main/java/org/springframework/cloud/config/server/config/EnvironmentRepositoryConfiguration.java @@ -253,6 +253,8 @@ public class EnvironmentRepositoryConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnClass(JdbcTemplate.class) + @ConditionalOnProperty(value = "spring.cloud.config.server.jdbc.enabled", + matchIfMissing = true) static class JdbcFactoryConfig { @Bean @@ -408,6 +410,8 @@ class CredhubRepositoryConfiguration { @Configuration(proxyBeanMethods = false) @Profile("jdbc") @ConditionalOnClass(JdbcTemplate.class) +@ConditionalOnProperty(value = "spring.cloud.config.server.jdbc.enabled", + matchIfMissing = true) class JdbcRepositoryConfiguration { @Bean 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 f078f8b6..61e34459 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 @@ -22,6 +22,7 @@ import org.springframework.core.Ordered; /** * @author Dylan Roberts + * @author Thomas Vitale */ @ConfigurationProperties("spring.cloud.config.server.jdbc") public class JdbcEnvironmentProperties implements EnvironmentRepositoryProperties { @@ -29,11 +30,24 @@ public class JdbcEnvironmentProperties implements EnvironmentRepositoryPropertie private static final String DEFAULT_SQL = "SELECT KEY, VALUE from PROPERTIES" + " where APPLICATION=? and PROFILE=? and LABEL=?"; + /** + * Flag to indicate that JDBC environment repository configuration is enabled. + */ + private boolean enabled = true; + private int order = Ordered.LOWEST_PRECEDENCE - 10; /** SQL used to query database for keys and values. */ private String sql = DEFAULT_SQL; + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + public int getOrder() { return this.order; } diff --git a/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryConfigurationTests.java b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryConfigurationTests.java new file mode 100644 index 00000000..6e1eeb45 --- /dev/null +++ b/spring-cloud-config-server/src/test/java/org/springframework/cloud/config/server/environment/JdbcEnvironmentRepositoryConfigurationTests.java @@ -0,0 +1,85 @@ +/* + * Copyright 2016-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.cloud.config.server.environment; + +import java.io.IOException; + +import org.junit.Test; + +import org.springframework.boot.test.context.assertj.AssertableWebApplicationContext; +import org.springframework.boot.test.context.runner.ContextConsumer; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; +import org.springframework.cloud.config.server.ConfigServerApplication; +import org.springframework.cloud.config.server.test.ConfigServerTestUtils; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests to verify JdbcEnvironmentRepository configuration. + * + * @author Thomas Vitale + */ +public class JdbcEnvironmentRepositoryConfigurationTests { + + @Test + public void jdbcEnvironmentRepositoryBeansConfiguredWhenDefault() throws IOException { + new WebApplicationContextRunner() + .withUserConfiguration(ConfigServerApplication.class) + .withPropertyValues("spring.profiles.active=test,jdbc", + "spring.main.web-application-type=none") + .run(context -> { + assertThat(context) + .hasSingleBean(JdbcEnvironmentRepositoryFactory.class); + assertThat(context).hasSingleBean(JdbcEnvironmentRepository.class); + }); + } + + @Test + public void jdbcEnvironmentRepositoryBeansConfiguredWhenEnabled() throws IOException { + getApplicationContextWithJdbcEnabled(true, context -> { + assertThat(context).hasSingleBean(JdbcEnvironmentRepositoryFactory.class); + assertThat(context).hasSingleBean(JdbcEnvironmentRepository.class); + }); + } + + @Test + public void jdbcEnvironmentRepositoryFactoryNotConfiguredWhenDisabled() + throws IOException { + getApplicationContextWithJdbcEnabled(false, context -> assertThat(context) + .doesNotHaveBean(JdbcEnvironmentRepositoryFactory.class)); + } + + @Test + public void jdbcEnvironmentRepositoryNotConfiguredWhenDisabled() throws IOException { + getApplicationContextWithJdbcEnabled(false, context -> assertThat(context) + .doesNotHaveBean(JdbcEnvironmentRepository.class)); + } + + private void getApplicationContextWithJdbcEnabled(boolean jdbcEnabled, + ContextConsumer consumer) + throws IOException { + String uri = ConfigServerTestUtils.prepareLocalRepo(); + new WebApplicationContextRunner() + .withUserConfiguration(ConfigServerApplication.class) + .withPropertyValues("spring.profiles.active=test,jdbc", + "spring.main.web-application-type=none", + "spring.cloud.config.server.git.uri:" + uri, + "spring.cloud.config.server.jdbc.enabled:" + jdbcEnabled) + .run(consumer); + } + +}