From 824cba3d22c20e8f50c260e0f79990a8b2148199 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Thu, 16 Nov 2017 15:41:35 -0500 Subject: [PATCH] Allow for optional ServletContext. fixes gh-314 --- ...oServiceRegistrationAutoConfiguration.java | 15 ++++- ...sulAutoServiceRegistrationNonWebTests.java | 67 +++++++++++++++++++ 2 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationNonWebTests.java 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 08de5812..b1eeacf6 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 @@ -18,10 +18,13 @@ package org.springframework.cloud.consul.serviceregistry; import javax.servlet.ServletContext; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationProperties; import org.springframework.cloud.consul.ConditionalOnConsulEnabled; import org.springframework.cloud.consul.discovery.ConsulDiscoveryProperties; @@ -41,6 +44,9 @@ import org.springframework.context.annotation.Configuration; @AutoConfigureAfter(ConsulServiceRegistryAutoConfiguration.class) public class ConsulAutoServiceRegistrationAutoConfiguration { + @Autowired(required = false) + private ServerProperties serverProperties; + @Bean @ConditionalOnMissingBean public ConsulAutoServiceRegistration consulAutoServiceRegistration(ConsulServiceRegistry registry, ConsulDiscoveryProperties properties, ConsulAutoRegistration consulRegistration) { @@ -50,8 +56,13 @@ public class ConsulAutoServiceRegistrationAutoConfiguration { @Bean @ConditionalOnMissingBean public ConsulAutoRegistration consulRegistration(ConsulDiscoveryProperties properties, ApplicationContext applicationContext, - ServletContext servletContext, HeartbeatProperties heartbeatProperties) { - return ConsulAutoRegistration.registration(properties, applicationContext, servletContext, heartbeatProperties); + ObjectProvider servletContext, HeartbeatProperties heartbeatProperties) { + ConsulAutoRegistration registration = ConsulAutoRegistration.registration(properties, applicationContext, servletContext.getIfAvailable(), heartbeatProperties); + + if (serverProperties != null && serverProperties.getPort() != null && serverProperties.getPort() > 0) { + registration.initializePort(serverProperties.getPort()); + } + return registration; } } 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..9337e61f --- /dev/null +++ b/spring-cloud-consul-discovery/src/test/java/org/springframework/cloud/consul/serviceregistry/ConsulAutoServiceRegistrationNonWebTests.java @@ -0,0 +1,67 @@ +/* + * Copyright 2013-2016 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 { } +}