From ec4d52e38145e7fe9586aa767efb17e158c68a37 Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Wed, 10 May 2023 10:47:08 +0200 Subject: [PATCH] Add ReactiveResponseConsumer classpath check to http5 auto-configuration Closes gh-34964 --- .../spring-boot-autoconfigure/build.gradle | 3 ++- .../client/ClientHttpConnectorConfiguration.java | 3 ++- .../client/ClientHttpConnectorConfigurationTests.java | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/build.gradle b/spring-boot-project/spring-boot-autoconfigure/build.gradle index 6c6cdc76bac..724c0f502e5 100644 --- a/spring-boot-project/spring-boot-autoconfigure/build.gradle +++ b/spring-boot-project/spring-boot-autoconfigure/build.gradle @@ -73,6 +73,7 @@ dependencies { exclude group: "commons-logging", module: "commons-logging" } optional("org.apache.httpcomponents.client5:httpclient5") + optional("org.apache.httpcomponents.core5:httpcore5-reactive") optional("org.apache.kafka:kafka-streams") optional("org.apache.solr:solr-solrj") { exclude group: "org.slf4j", module: "jcl-over-slf4j" @@ -275,4 +276,4 @@ tasks.named("checkSpringConfigurationMetadata").configure { "spring.datasource.tomcat.*", "spring.groovy.template.configuration.*" ] -} \ No newline at end of file +} diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfiguration.java index 85ec0c5392f..be43dbbbe60 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfiguration.java @@ -18,6 +18,7 @@ package org.springframework.boot.autoconfigure.web.reactive.function.client; import org.apache.hc.client5.http.impl.async.HttpAsyncClients; import org.apache.hc.core5.http.nio.AsyncRequestProducer; +import org.apache.hc.core5.reactive.ReactiveResponseConsumer; import org.eclipse.jetty.client.HttpClient; import org.eclipse.jetty.util.ssl.SslContextFactory; @@ -87,7 +88,7 @@ class ClientHttpConnectorConfiguration { } @Configuration(proxyBeanMethods = false) - @ConditionalOnClass({ HttpAsyncClients.class, AsyncRequestProducer.class }) + @ConditionalOnClass({ HttpAsyncClients.class, AsyncRequestProducer.class, ReactiveResponseConsumer.class }) @ConditionalOnMissingBean(ClientHttpConnector.class) static class HttpClient5 { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfigurationTests.java index 5e25714e186..9314605c18b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/reactive/function/client/ClientHttpConnectorConfigurationTests.java @@ -24,8 +24,10 @@ import org.eclipse.jetty.util.thread.Scheduler; import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; import org.springframework.context.annotation.Bean; +import org.springframework.http.client.reactive.HttpComponentsClientHttpConnector; import org.springframework.http.client.reactive.JettyClientHttpConnector; import org.springframework.http.client.reactive.JettyResourceFactory; import org.springframework.test.util.ReflectionTestUtils; @@ -38,6 +40,7 @@ import static org.mockito.Mockito.mock; * * @author Phillip Webb * @author Brian Clozel + * @author Moritz Halbritter */ class ClientHttpConnectorConfigurationTests { @@ -83,6 +86,14 @@ class ClientHttpConnectorConfigurationTests { }); } + @Test + void shouldNotConfigureReactiveHttpClient5WhenHttpCore5ReactiveJarIsMissing() { + new ReactiveWebApplicationContextRunner() + .withClassLoader(new FilteredClassLoader("org.apache.hc.core5.reactive")) + .withConfiguration(AutoConfigurations.of(ClientHttpConnectorConfiguration.HttpClient5.class)) + .run((context) -> assertThat(context).doesNotHaveBean(HttpComponentsClientHttpConnector.class)); + } + static class CustomHttpClientMapper { static boolean called = false;