From 817db5b5b5a9063c0833bb5424a04ee3b0f37ceb Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Tue, 31 Oct 2017 13:08:21 -0400 Subject: [PATCH] Make webflux optional --- pom.xml | 6 +++ spring-cloud-gateway-core/pom.xml | 5 +++ .../config/GatewayAutoConfiguration.java | 3 +- ...ewayClassPathWarningAutoConfiguration.java | 27 +++++++++++-- ...ayLoadBalancerClientAutoConfiguration.java | 3 +- .../config/GatewayRedisAutoConfiguration.java | 3 +- .../main/resources/META-INF/spring.factories | 2 +- .../gateway/test/WebfluxNotIncludedTests.java | 40 +++++++++++++++++++ spring-cloud-starter-gateway/pom.xml | 4 -- 9 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/WebfluxNotIncludedTests.java diff --git a/pom.xml b/pom.xml index f4d2c4e0..39803e64 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,12 @@ + + org.springframework.cloud + spring-cloud-test-support + test + ${spring-cloud-commons.version} + org.springframework.cloud spring-cloud-starter-netflix-eureka-client diff --git a/spring-cloud-gateway-core/pom.xml b/spring-cloud-gateway-core/pom.xml index 321a9497..883ee9c2 100644 --- a/spring-cloud-gateway-core/pom.xml +++ b/spring-cloud-gateway-core/pom.xml @@ -76,6 +76,11 @@ spring-boot-starter-test test + + org.springframework.cloud + spring-cloud-test-support + test + io.projectreactor reactor-test diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java index 2a2f5060..284fbe01 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayAutoConfiguration.java @@ -104,7 +104,8 @@ import rx.RxReactiveStreams; @ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true) @EnableConfigurationProperties @AutoConfigureBefore(HttpHandlerAutoConfiguration.class) -@AutoConfigureAfter(GatewayLoadBalancerClientAutoConfiguration.class) +@AutoConfigureAfter({GatewayLoadBalancerClientAutoConfiguration.class, GatewayClassPathWarningAutoConfiguration.class}) +@ConditionalOnClass(DispatcherHandler.class) public class GatewayAutoConfiguration { @Configuration diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayClassPathWarningAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayClassPathWarningAutoConfiguration.java index 6a8e583d..099faf9b 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayClassPathWarningAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayClassPathWarningAutoConfiguration.java @@ -2,18 +2,37 @@ package org.springframework.cloud.gateway.config; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass; import org.springframework.context.annotation.Configuration; @Configuration -@ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet") +@AutoConfigureBefore(GatewayAutoConfiguration.class) public class GatewayClassPathWarningAutoConfiguration { private static final Log log = LogFactory.getLog(GatewayClassPathWarningAutoConfiguration.class); private static final String BORDER = "\n\n**********************************************************\n\n"; - public GatewayClassPathWarningAutoConfiguration() { - log.warn(BORDER+"Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. "+ - "Please remove spring-boot-starter-web dependency."+BORDER); + @Configuration + @ConditionalOnClass(name = "org.springframework.web.servlet.DispatcherServlet") + protected static class SpringMvcFoundOnClasspathConfiguration { + + public SpringMvcFoundOnClasspathConfiguration() { + log.warn(BORDER+"Spring MVC found on classpath, which is incompatible with Spring Cloud Gateway at this time. "+ + "Please remove spring-boot-starter-web dependency."+BORDER); + } + + } + + @Configuration + @ConditionalOnMissingClass("org.springframework.web.reactive.DispatcherHandler") + protected static class WebfluxMissingFromClasspathConfiguration { + + public WebfluxMissingFromClasspathConfiguration() { + log.warn(BORDER+"Spring Webflux is missing from the classpath, which is required for Spring Cloud Gateway at this time. "+ + "Please add spring-boot-starter-webflux dependency."+BORDER); + } + } } diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayLoadBalancerClientAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayLoadBalancerClientAutoConfiguration.java index ea55bdf2..b6848a34 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayLoadBalancerClientAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayLoadBalancerClientAutoConfiguration.java @@ -25,12 +25,13 @@ import org.springframework.cloud.gateway.filter.LoadBalancerClientFilter; import org.springframework.cloud.netflix.ribbon.RibbonAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.DispatcherHandler; /** * @author Spencer Gibb */ @Configuration -@ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class}) +@ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class, DispatcherHandler.class}) @AutoConfigureAfter(RibbonAutoConfiguration.class) public class GatewayLoadBalancerClientAutoConfiguration { diff --git a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java index 0474b4e9..a150d42b 100644 --- a/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java +++ b/spring-cloud-gateway-core/src/main/java/org/springframework/cloud/gateway/config/GatewayRedisAutoConfiguration.java @@ -22,12 +22,13 @@ import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.scripting.support.ResourceScriptSource; +import org.springframework.web.reactive.DispatcherHandler; @Configuration @AutoConfigureAfter(RedisReactiveAutoConfiguration.class) @AutoConfigureBefore(GatewayAutoConfiguration.class) @ConditionalOnBean(ReactiveRedisTemplate.class) -@ConditionalOnClass(RedisTemplate.class) +@ConditionalOnClass({RedisTemplate.class, DispatcherHandler.class}) class GatewayRedisAutoConfiguration { @Bean diff --git a/spring-cloud-gateway-core/src/main/resources/META-INF/spring.factories b/spring-cloud-gateway-core/src/main/resources/META-INF/spring.factories index f831db65..f5386f12 100644 --- a/spring-cloud-gateway-core/src/main/resources/META-INF/spring.factories +++ b/spring-cloud-gateway-core/src/main/resources/META-INF/spring.factories @@ -1,6 +1,6 @@ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ -org.springframework.cloud.gateway.config.GatewayAutoConfiguration,\ org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration,\ +org.springframework.cloud.gateway.config.GatewayAutoConfiguration,\ org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration,\ org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration diff --git a/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/WebfluxNotIncludedTests.java b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/WebfluxNotIncludedTests.java new file mode 100644 index 00000000..f346d869 --- /dev/null +++ b/spring-cloud-gateway-core/src/test/java/org/springframework/cloud/gateway/test/WebfluxNotIncludedTests.java @@ -0,0 +1,40 @@ +/* + * 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.gateway.test; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.cloud.test.ClassPathExclusions; +import org.springframework.cloud.test.ModifiedClassPathRunner; + +@RunWith(ModifiedClassPathRunner.class) +@ClassPathExclusions({"spring-webflux-*.jar"}) +public class WebfluxNotIncludedTests { + + @Test + public void noWebfluxWorks() { + new SpringApplication(Config.class).run(); + } + + @SpringBootConfiguration + @EnableAutoConfiguration + public static class Config {} +} diff --git a/spring-cloud-starter-gateway/pom.xml b/spring-cloud-starter-gateway/pom.xml index 41dad491..88e712b1 100644 --- a/spring-cloud-starter-gateway/pom.xml +++ b/spring-cloud-starter-gateway/pom.xml @@ -24,9 +24,5 @@ org.springframework.cloud spring-cloud-gateway-core - - org.springframework.boot - spring-boot-starter-webflux -