From 3596e67e1141f5bb074703a0f1a2eadd433756fb Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 23 Jan 2015 10:44:37 -0700 Subject: [PATCH] create NoopDiscoveryClient if there is not a DiscoveryClient bean via auto config rather than import selector. The import selector does not take into account @Conditional* annotations on the imported configurations. fixes gh-g again --- ...NoopDiscoveryClientAutoConfiguration.java} | 4 +- .../NoopDiscoveryClientImportSelector.java | 46 ------------ src/main/resources/META-INF/spring.factories | 2 +- ...eryClientConfigurationAdditionalTests.java | 73 +++++++++++++++++++ ...oopDiscoveryClientConfigurationTests.java} | 4 +- 5 files changed, 79 insertions(+), 50 deletions(-) rename src/main/java/org/springframework/cloud/client/discovery/{NoopDiscoveryClientConfiguration.java => NoopDiscoveryClientAutoConfiguration.java} (93%) delete mode 100644 src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelector.java create mode 100644 src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationAdditionalTests.java rename src/test/java/org/springframework/cloud/client/discovery/{NoopDiscoveryClientImportSelectorTests.java => NoopDiscoveryClientConfigurationTests.java} (87%) diff --git a/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfiguration.java b/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientAutoConfiguration.java similarity index 93% rename from src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfiguration.java rename to src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientAutoConfiguration.java index 09ff6e07..2524a854 100644 --- a/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfiguration.java +++ b/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientAutoConfiguration.java @@ -24,6 +24,7 @@ import javax.annotation.PostConstruct; import lombok.extern.apachecommons.CommonsLog; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.web.ServerProperties; import org.springframework.boot.context.embedded.EmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedWebApplicationContext; @@ -41,8 +42,9 @@ import org.springframework.core.env.Environment; */ @Configuration @EnableConfigurationProperties +@ConditionalOnMissingBean(DiscoveryClient.class) @CommonsLog -public class NoopDiscoveryClientConfiguration implements +public class NoopDiscoveryClientAutoConfiguration implements ApplicationListener { @Autowired(required = false) diff --git a/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelector.java b/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelector.java deleted file mode 100644 index 8a5190df..00000000 --- a/src/main/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelector.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright 2013-2015 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.client.discovery; - -import lombok.extern.apachecommons.CommonsLog; - -import org.springframework.context.annotation.DeferredImportSelector; -import org.springframework.core.annotation.AnnotationAttributes; -import org.springframework.core.type.AnnotationMetadata; - -/** - * Import Selector that only returns a NoopDiscoveryClientConfiguration if the - * @EnableDiscoveryClient annotation has NOT been used. - * @author Spencer Gibb - */ -@CommonsLog -public class NoopDiscoveryClientImportSelector implements - DeferredImportSelector { - - @Override - public String[] selectImports(AnnotationMetadata metadata) { - AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata - .getAnnotationAttributes(EnableDiscoveryClient.class.getName(), true)); - - if (attributes == null) { - // @EnableDiscoveryClient has not been used, so configure the noop client - return new String[] { NoopDiscoveryClientConfiguration.class.getName() }; - } - - return new String[]{}; - } -} diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories index d5290402..a96848cf 100644 --- a/src/main/resources/META-INF/spring.factories +++ b/src/main/resources/META-INF/spring.factories @@ -1,4 +1,4 @@ # Bootstrap Configuration org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.cloud.client.CommonsClientAutoConfiguration,\ -org.springframework.cloud.client.discovery.NoopDiscoveryClientImportSelector +org.springframework.cloud.client.discovery.NoopDiscoveryClientAutoConfiguration diff --git a/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationAdditionalTests.java b/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationAdditionalTests.java new file mode 100644 index 00000000..a93803dc --- /dev/null +++ b/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationAdditionalTests.java @@ -0,0 +1,73 @@ +package org.springframework.cloud.client.discovery; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.util.List; + +/** + * Tests if @EnableDiscoveryClient is NOT used, then NoopDiscoveryClient is created. + * @author Spencer Gibb + */ +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = NoopDiscoveryClientConfigurationAdditionalTests.App.class) +public class NoopDiscoveryClientConfigurationAdditionalTests { + + @Autowired + DiscoveryClient discoveryClient; + + @Test + public void testDiscoveryClientIsNotNoop() { + assertFalse("discoveryClient is wrong instance type", discoveryClient instanceof NoopDiscoveryClient); + } + + @EnableAutoConfiguration + @Configuration + public static class App { + + @Bean + public DiscoveryClient discoveryClient() { + return new DiscoveryClient() { + @Override + public String description() { + return null; + } + + @Override + public ServiceInstance getLocalServiceInstance() { + return null; + } + + @Override + public List getInstances(String serviceId) { + return null; + } + + @Override + public List getAllInstances() { + return null; + } + + @Override + public List getServices() { + return null; + } + }; + } + + public static void main(String[] args) { + SpringApplication.run(App.class, args); + } + } +} diff --git a/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelectorTests.java b/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationTests.java similarity index 87% rename from src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelectorTests.java rename to src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationTests.java index bf7fc068..1dabd780 100644 --- a/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientImportSelectorTests.java +++ b/src/test/java/org/springframework/cloud/client/discovery/NoopDiscoveryClientConfigurationTests.java @@ -16,8 +16,8 @@ import static org.junit.Assert.*; * @author Spencer Gibb */ @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = NoopDiscoveryClientImportSelectorTests.App.class) -public class NoopDiscoveryClientImportSelectorTests { +@SpringApplicationConfiguration(classes = NoopDiscoveryClientConfigurationTests.App.class) +public class NoopDiscoveryClientConfigurationTests { @Autowired DiscoveryClient discoveryClient;