diff --git a/pom.xml b/pom.xml
index 20ef3f7d..2aa54454 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
spring-cloud-consul-config
spring-cloud-consul-discovery
spring-cloud-consul-binder
- spring-cloud-consul-sample
+ spring-cloud-consul-integration-tests
spring-cloud-starter-consul
spring-cloud-starter-consul-bus
spring-cloud-starter-consul-config
diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java
index ca4bb53c..d17d1b98 100644
--- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java
+++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java
@@ -38,6 +38,7 @@ import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.cloud.consul.ConsulAutoConfiguration;
import org.springframework.cloud.consul.ConsulProperties;
+import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.lang.Nullable;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -153,8 +154,11 @@ public class ConsulConfigDataLocationResolver implements ConfigDataLocationResol
registerBean(context, type, supplier);
context.getBootstrapContext().addCloseListener(event -> {
T instance = event.getBootstrapContext().get(type);
- event.getApplicationContext().getBeanFactory().registerSingleton("configData" + type.getSimpleName(),
- instance);
+ String name = "configData" + type.getSimpleName();
+ ConfigurableApplicationContext appCtxt = event.getApplicationContext();
+ if (!appCtxt.containsBean(name)) {
+ appCtxt.getBeanFactory().registerSingleton(name, instance);
+ }
});
}
diff --git a/spring-cloud-consul-integration-tests/pom.xml b/spring-cloud-consul-integration-tests/pom.xml
new file mode 100644
index 00000000..4a576842
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/pom.xml
@@ -0,0 +1,21 @@
+
+
+ 4.0.0
+
+ org.springframework.cloud
+ spring-cloud-consul
+ 3.0.0-SNAPSHOT
+ ..
+
+ spring-cloud-consul-integration-tests
+ spring-cloud-consul-integration-tests
+ spring-cloud-consul-integration-tests
+ pom
+
+
+ spring-cloud-consul-bootstrap-tests
+ spring-cloud-consul-configdata-tests
+
+
diff --git a/spring-cloud-consul-sample/pom.xml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml
similarity index 79%
rename from spring-cloud-consul-sample/pom.xml
rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml
index 0cac69f2..23ac7321 100644
--- a/spring-cloud-consul-sample/pom.xml
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/pom.xml
@@ -4,14 +4,14 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- spring-cloud-consul-sample
+ spring-cloud-consul-bootstrap-tests
jar
- Spring Cloud Consul Sample
- Spring Cloud Consul Sample
+ Spring Cloud Consul Bootstrap Integration Tests
+ Spring Cloud Consul Bootstrap Integration Tests
org.springframework.cloud
- spring-cloud-consul
+ spring-cloud-consul-integration-tests
3.0.0-SNAPSHOT
..
@@ -44,6 +44,10 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.springframework.cloud
+ spring-cloud-starter-bootstrap
+
org.springframework.cloud
spring-cloud-starter-consul-all
diff --git a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java
similarity index 94%
rename from spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java
rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java
index 43bb6bbd..f08aaafe 100644
--- a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleConsulApplication.java
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/ConsulBootstrapApplication.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.consul.sample;
+package org.springframework.cloud.consul.bootstraptests;
import java.util.List;
@@ -50,10 +50,7 @@ import org.springframework.web.client.RestTemplate;
@EnableConfigurationProperties
@EnableFeignClients
@Slf4j
-public class SampleConsulApplication /*
- * implements
- * ApplicationListener
- */ {
+public class ConsulBootstrapApplication {
@Autowired
private LoadBalancerClient loadBalancer;
@@ -77,7 +74,7 @@ public class SampleConsulApplication /*
private String appName;
public static void main(String[] args) {
- SpringApplication.run(SampleConsulApplication.class, args);
+ SpringApplication.run(ConsulBootstrapApplication.class, args);
}
@RequestMapping("/me")
diff --git a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java
similarity index 93%
rename from spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java
rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java
index 8cd7729e..1fa3e4d1 100644
--- a/spring-cloud-consul-sample/src/main/java/org/springframework/cloud/consul/sample/SampleProperties.java
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/java/org/springframework/cloud/consul/bootstraptests/SampleProperties.java
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package org.springframework.cloud.consul.sample;
+package org.springframework.cloud.consul.bootstraptests;
import lombok.Data;
diff --git a/spring-cloud-consul-sample/src/main/resources/application.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/application.yml
similarity index 100%
rename from spring-cloud-consul-sample/src/main/resources/application.yml
rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/application.yml
diff --git a/spring-cloud-consul-sample/src/main/resources/bootstrap.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/bootstrap.yml
similarity index 100%
rename from spring-cloud-consul-sample/src/main/resources/bootstrap.yml
rename to spring-cloud-consul-integration-tests/spring-cloud-consul-bootstrap-tests/src/main/resources/bootstrap.yml
diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml
new file mode 100644
index 00000000..a50c0a9c
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/pom.xml
@@ -0,0 +1,80 @@
+
+
+ 4.0.0
+
+ spring-cloud-consul-configdata-tests
+ jar
+ Spring Cloud Consul ConfigData Integration Tests
+ Spring Cloud Consul ConfigData Integration Tests
+
+
+ org.springframework.cloud
+ spring-cloud-consul-integration-tests
+ 3.0.0-SNAPSHOT
+ ..
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ repackage
+
+
+
+
+
+
+ maven-deploy-plugin
+
+ true
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.cloud
+ spring-cloud-starter-consul-all
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+ org.projectlombok
+ lombok
+
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.testcontainers
+ testcontainers
+ test
+
+
+ org.springframework.cloud
+ spring-cloud-consul-core
+ ${project.version}
+ test-jar
+ test
+
+
+
+
diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java
new file mode 100644
index 00000000..a7913b13
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplication.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2013-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.consul.configdatatests;
+
+import java.util.List;
+
+import lombok.extern.slf4j.Slf4j;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.cloud.client.loadbalancer.LoadBalanced;
+import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
+import org.springframework.cloud.client.serviceregistry.Registration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.env.Environment;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author Spencer Gibb
+ */
+@SpringBootApplication
+@RestController
+@EnableConfigurationProperties
+@Slf4j
+public class ConsulConfigDataApplication {
+
+ @Autowired
+ private LoadBalancerClient loadBalancer;
+
+ @Autowired
+ private DiscoveryClient discoveryClient;
+
+ @Autowired
+ private Environment env;
+
+ @Autowired
+ private RestTemplate restTemplate;
+
+ @Autowired
+ private Registration registration;
+
+ @Value("${spring.application.name:testConsulApp}")
+ private String appName;
+
+ public static void main(String[] args) {
+ SpringApplication.run(ConsulConfigDataApplication.class, args);
+ }
+
+ @RequestMapping("/me")
+ public ServiceInstance me() {
+ return this.registration;
+ }
+
+ @RequestMapping("/")
+ public ServiceInstance lb() {
+ return this.loadBalancer.choose(this.appName);
+ }
+
+ @RequestMapping("/rest")
+ public String rest() {
+ return this.restTemplate.getForObject("http://" + this.appName + "/me", String.class);
+ }
+
+ @RequestMapping("/choose")
+ public String choose() {
+ return this.loadBalancer.choose(this.appName).getUri().toString();
+ }
+
+ @RequestMapping("/myenv")
+ public String env(@RequestParam("prop") String prop) {
+ return this.env.getProperty(prop, "Not Found");
+ }
+
+ @RequestMapping("/prop")
+ public String prop() {
+ return sampleProperties().getProp();
+ }
+
+ @RequestMapping("/instances")
+ public List instances() {
+ return this.discoveryClient.getInstances(this.appName);
+ }
+
+ @Bean
+ public SampleProperties sampleProperties() {
+ return new SampleProperties();
+ }
+
+ @Bean
+ @LoadBalanced
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java
new file mode 100644
index 00000000..75c0ef5e
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/java/org/springframework/cloud/consul/configdatatests/SampleProperties.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2013-2019 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.consul.configdatatests;
+
+import lombok.Data;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author Spencer Gibb
+ */
+@ConfigurationProperties("sample")
+@Data
+public class SampleProperties {
+
+ private String prop = "default value";
+
+}
diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml
new file mode 100644
index 00000000..ebbee05b
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/main/resources/application.yml
@@ -0,0 +1,12 @@
+server:
+ port: 0
+
+spring:
+ application:
+ name: testConsulConfigDataIntegrationTestApp
+ config:
+ import: 'optional:consul:'
+
+logging:
+ level:
+ org.springframework.cloud.consul: DEBUG
diff --git a/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java
new file mode 100644
index 00000000..d4c547f9
--- /dev/null
+++ b/spring-cloud-consul-integration-tests/spring-cloud-consul-configdata-tests/src/test/java/org/springframework/cloud/consul/configdatatests/ConsulConfigDataApplicationTests.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2013-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.consul.configdatatests;
+
+import java.util.UUID;
+
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.cloud.consul.test.ConsulTestcontainers;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+public class ConsulConfigDataApplicationTests {
+
+ private static final String APP_NAME = "testConsulConfigDataIntegration";
+
+ private static final String PREFIX = "_configDataIntegrationTests_config__";
+
+ private static final String ROOT = PREFIX + UUID.randomUUID();
+
+ private static ConfigurableApplicationContext context;
+
+ @BeforeAll
+ public static void setup() {
+ ConsulTestcontainers.start();
+
+ SpringApplication application = new SpringApplication(ConsulConfigDataApplication.class);
+ context = application.run("--spring.application.name=" + APP_NAME,
+ "--spring.config.import=consul:" + ConsulTestcontainers.getHost() + ":"
+ + ConsulTestcontainers.getPort(),
+ "--spring.cloud.consul.config.prefix=" + ROOT, "--spring.cloud.consul.config.watch.delay=10");
+
+ }
+
+ @AfterAll
+ public static void teardown() {
+ if (context != null) {
+ context.close();
+ }
+ }
+
+ @Test
+ public void contextLoads() {
+ }
+
+}