Skip to content

Commit ea35d4e

Browse files
committed
DefaultWebClientBuilder defaults using classpath
Previously DefaultWebClientBuilder always defaulted the ClientHttpConnector with ReactorClientHttpConnector. This worked fine if reactor was used. However, it would break if the user was trying to leverage Jetty. This commit defaults to use Reactory Netty HttpClient if it is present. If it is not present it then Jetty's HttpClient is used if present. Closes spring-projectsgh-23491
1 parent aa6e762 commit ea35d4e

File tree

1 file changed

+24
-1
lines changed

1 file changed

+24
-1
lines changed

spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClientBuilder.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@
2525

2626
import org.springframework.http.HttpHeaders;
2727
import org.springframework.http.client.reactive.ClientHttpConnector;
28+
import org.springframework.http.client.reactive.JettyClientHttpConnector;
2829
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
2930
import org.springframework.lang.Nullable;
3031
import org.springframework.util.Assert;
32+
import org.springframework.util.ClassUtils;
3133
import org.springframework.util.CollectionUtils;
3234
import org.springframework.util.LinkedMultiValueMap;
3335
import org.springframework.util.MultiValueMap;
@@ -41,6 +43,17 @@
4143
* @since 5.0
4244
*/
4345
final class DefaultWebClientBuilder implements WebClient.Builder {
46+
private static final boolean jettyHttpClientPresent;
47+
48+
private static final boolean reactorNettyHttpClientPresent;
49+
50+
static {
51+
ClassLoader classLoader = DefaultWebClientBuilder.class.getClassLoader();
52+
jettyHttpClientPresent = ClassUtils.isPresent(
53+
"org.eclipse.jetty.client.HttpClient", classLoader);
54+
reactorNettyHttpClientPresent = ClassUtils.isPresent(
55+
"reactor.netty.http.client.HttpClient", classLoader);
56+
}
4457

4558
@Nullable
4659
private String baseUrl;
@@ -234,8 +247,18 @@ else if (this.connector != null) {
234247
return ExchangeFunctions.create(this.connector, this.exchangeStrategies);
235248
}
236249
else {
237-
return ExchangeFunctions.create(new ReactorClientHttpConnector(), this.exchangeStrategies);
250+
return ExchangeFunctions.create(createDefaultClientHttpConnector(), this.exchangeStrategies);
251+
}
252+
}
253+
254+
private ClientHttpConnector createDefaultClientHttpConnector() {
255+
if (reactorNettyHttpClientPresent) {
256+
return new ReactorClientHttpConnector();
257+
}
258+
else if (jettyHttpClientPresent) {
259+
return new JettyClientHttpConnector();
238260
}
261+
throw new IllegalStateException("No suitable default ClientHttpConnector found");
239262
}
240263

241264
private UriBuilderFactory initUriBuilderFactory() {

0 commit comments

Comments
 (0)