diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java index 388cf269..24ffc1c2 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/ConsulLifecycle.java @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.List; import org.springframework.beans.BeansException; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.bind.RelaxedPropertyResolver; import org.springframework.cloud.client.discovery.AbstractDiscoveryLifecycle; import org.springframework.cloud.consul.serviceregistry.ConsulAutoRegistration; @@ -59,7 +60,7 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { private TtlScheduler ttlScheduler; - private ServletContext servletContext; + private ObjectProvider servletContext; private NewService service = new NewService(); @@ -76,7 +77,7 @@ public class ConsulLifecycle extends AbstractDiscoveryLifecycle { this.ttlScheduler = ttlScheduler; } - public void setServletContext(ServletContext servletContext) { + public void setServletContext(ObjectProvider servletContext) { this.servletContext = servletContext; } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TestConsulLifecycleConfiguration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TestConsulLifecycleConfiguration.java index c9cb26c4..53d7a505 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TestConsulLifecycleConfiguration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/discovery/TestConsulLifecycleConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.cloud.consul.discovery; import javax.servlet.ServletContext; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.context.annotation.Bean; @@ -37,7 +38,7 @@ public class TestConsulLifecycleConfiguration { private TtlScheduler ttlScheduler; @Autowired(required = false) - private ServletContext servletContext; + private ObjectProvider servletContext; @Bean public ConsulLifecycle consulLifecycle(ConsulClient consulClient, ConsulDiscoveryProperties discoveryProperties, diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java index fe73a77f..3aa2900f 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoRegistration.java @@ -73,7 +73,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { service.setAddress(properties.getHostname()); } service.setName(normalizeForDns(appName)); - service.setTags(createTags(properties, registrationCustomizers)); + service.setTags(createTags(properties)); if (properties.getPort() != null) { service.setPort(properties.getPort()); @@ -81,7 +81,17 @@ public class ConsulAutoRegistration extends ConsulRegistration { setCheck(service, properties, context, heartbeatProperties); } - return new ConsulAutoRegistration(service, properties, context, heartbeatProperties); + ConsulAutoRegistration registration = new ConsulAutoRegistration(service, properties, context, heartbeatProperties); + customize(registrationCustomizers, registration); + return registration; + } + + public static void customize(List registrationCustomizers, ConsulAutoRegistration registration) { + if (registrationCustomizers != null) { + for (ConsulRegistrationCustomizer customizer : registrationCustomizers) { + customizer.customize(registration); + } + } } @Deprecated //TODO: do I need this here, or should I just copy what I need back into lifecycle? @@ -97,7 +107,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { service.setAddress(properties.getHostname()); } service.setName(normalizeForDns(appName)); - service.setTags(createTags(properties, registrationCustomizers)); + service.setTags(createTags(properties)); // If an alternate external port is specified, register using it instead if (properties.getPort() != null) { @@ -110,7 +120,9 @@ public class ConsulAutoRegistration extends ConsulRegistration { setCheck(service, properties, context, heartbeatProperties); - return new ConsulAutoRegistration(service, properties, context, heartbeatProperties); + ConsulAutoRegistration registration = new ConsulAutoRegistration(service, properties, context, heartbeatProperties); + customize(registrationCustomizers, registration); + return registration; } public static void setCheck(NewService service, ConsulDiscoveryProperties properties, ApplicationContext context, HeartbeatProperties heartbeatProperties) { @@ -173,8 +185,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { return normalized.toString(); } - public static List createTags(ConsulDiscoveryProperties properties, - List registrationCustomizers) { + public static List createTags(ConsulDiscoveryProperties properties) { List tags = new LinkedList<>(properties.getTags()); if (!StringUtils.isEmpty(properties.getInstanceZone())) { @@ -183,11 +194,7 @@ public class ConsulAutoRegistration extends ConsulRegistration { if (!StringUtils.isEmpty(properties.getInstanceGroup())) { tags.add("group=" + properties.getInstanceGroup()); } - if (registrationCustomizers != null) { - for (ConsulRegistrationCustomizer customizer : registrationCustomizers) { - customizer.customizeTags(tags); - } - } + return tags; } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java index c083d75f..8c4bf234 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationAutoConfiguration.java @@ -16,9 +16,10 @@ package org.springframework.cloud.consul.serviceregistry; -import javax.servlet.ServletContext; import java.util.List; +import javax.servlet.ServletContext; + import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -61,7 +62,7 @@ public class ConsulAutoServiceRegistrationAutoConfiguration { @ConditionalOnClass(ServletContext.class) protected static class ConsulServletConfiguration { @Bean - public ConsulRegistrationCustomizer servletConsulCustomizer(final ServletContext servletContext) { + public ConsulRegistrationCustomizer servletConsulCustomizer(ObjectProvider servletContext) { return new ConsulServletRegistrationCustomizer(servletContext); } } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulRegistrationCustomizer.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulRegistrationCustomizer.java index 1e648c9e..2496e313 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulRegistrationCustomizer.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulRegistrationCustomizer.java @@ -16,11 +16,9 @@ package org.springframework.cloud.consul.serviceregistry; -import java.util.List; - /** * @author Piotr Wielgolaski */ public interface ConsulRegistrationCustomizer { - void customizeTags(List tags); + void customize(ConsulRegistration registration); } diff --git a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulServletRegistrationCustomizer.java b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulServletRegistrationCustomizer.java index 14196ac2..416df70d 100644 --- a/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulServletRegistrationCustomizer.java +++ b/spring-cloud-consul-discovery/src/main/java/org/springframework/cloud/consul/serviceregistry/ConsulServletRegistrationCustomizer.java @@ -17,26 +17,37 @@ package org.springframework.cloud.consul.serviceregistry; import javax.servlet.ServletContext; +import java.util.ArrayList; import java.util.List; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.util.StringUtils; /** * @author Piotr Wielgolaski */ public class ConsulServletRegistrationCustomizer implements ConsulRegistrationCustomizer { - private ServletContext servletContext; + private ObjectProvider servletContext; - public ConsulServletRegistrationCustomizer(ServletContext servletContext) { + public ConsulServletRegistrationCustomizer(ObjectProvider servletContext) { this.servletContext = servletContext; } @Override - public void customizeTags(List tags) { - if(servletContext != null - && StringUtils.hasText(servletContext.getContextPath()) - && StringUtils.hasText(servletContext.getContextPath().replaceAll("/", ""))) { - tags.add("contextPath=" + servletContext.getContextPath()); + public void customize(ConsulRegistration registration) { + if (servletContext == null) { + return; + } + ServletContext sc = servletContext.getIfAvailable(); + if(sc != null + && StringUtils.hasText(sc.getContextPath()) + && StringUtils.hasText(sc.getContextPath().replaceAll("/", ""))) { + List tags = registration.getService().getTags(); + if (tags == null) { + tags = new ArrayList<>(); + } + tags.add("contextPath=" + sc.getContextPath()); + registration.getService().setTags(tags); } } } diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationCustomizedServletContextTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationCustomizedServletContextTests.java index 832fc3b0..83e7970d 100644 --- a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationCustomizedServletContextTests.java +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationCustomizedServletContextTests.java @@ -22,10 +22,8 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration; -import org.springframework.cloud.consul.ConsulAutoConfiguration; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Configuration; import org.springframework.test.context.junit4.SpringRunner; @@ -64,9 +62,8 @@ public class ConsulAutoServiceRegistrationCustomizedServletContextTests { assertTrue("service context was wrong", service.getTags().contains("contextPath=/customContext")); } - + @EnableDiscoveryClient @Configuration @EnableAutoConfiguration - @ImportAutoConfiguration({ AutoServiceRegistrationConfiguration.class, ConsulAutoConfiguration.class, ConsulAutoServiceRegistrationAutoConfiguration.class }) public static class TestConfig { } } diff --git a/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationNonWebTests.java b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationNonWebTests.java new file mode 100644 index 00000000..e06ddc83 --- /dev/null +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationNonWebTests.java @@ -0,0 +1,67 @@ +/* + * Copyright 2013-2017 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 + * + * http://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.serviceregistry; + +import java.util.Map; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringRunner; + +import com.ecwid.consul.v1.ConsulClient; +import com.ecwid.consul.v1.Response; +import com.ecwid.consul.v1.agent.model.Service; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; + +/** + * @author Spencer Gibb + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ConsulAutoServiceRegistrationNonWebTests.TestConfig.class, + properties = { "spring.application.name=consulNonWebTest", "server.port=32111" }, + webEnvironment = NONE) +public class ConsulAutoServiceRegistrationNonWebTests { + + @Autowired + private ConsulClient consul; + + @Autowired(required = false) + private ConsulAutoServiceRegistration autoServiceRegistration; + + @Test + public void contextLoads() { + assertNotNull("ConsulAutoServiceRegistration was created", autoServiceRegistration); + + Response> response = consul.getAgentServices(); + Map services = response.getValue(); + Service service = services.get("consulNonWebTest"); + assertNull("service was registered", service); //no port to listen, hence no registration + } + + @EnableDiscoveryClient + @Configuration + @EnableAutoConfiguration + public static class TestConfig { } +} \ No newline at end of file