From 022f3cb0198552bd730f081f2f6d35186da8d004 Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Thu, 24 Oct 2024 00:00:35 -0700 Subject: [PATCH] Add `requestFactorySettings` method to `RestTemplateBuilder` Add a `requestFactorySettings` method to `RestTemplateBuilder` to make it easier to apply an existing `ClientHttpRequestFactorySettings` instance. Closes gh-42885 --- .../boot/web/client/RestTemplateBuilder.java | 16 ++++++++++++++++ .../web/client/RestTemplateBuilderTests.java | 15 ++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java index b3daff38eac..06f45dee1cc 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/RestTemplateBuilder.java @@ -429,6 +429,22 @@ public class RestTemplateBuilder { this.customizers, this.requestCustomizers); } + /** + * Sets the {@link ClientHttpRequestFactorySettings}. This will replace any previously + * set {@link #connectTimeout(Duration) connectTimeout} ,{@link #readTimeout(Duration) + * readTimeout} and {@link #sslBundle(SslBundle) sslBundle} values. + * @param requestFactorySettings the request factory settings + * @return a new builder instance + * @since 3.4.0 + */ + public RestTemplateBuilder requestFactorySettings(ClientHttpRequestFactorySettings requestFactorySettings) { + Assert.notNull(requestFactorySettings, "ClientHttpRequestFactorySettings must not be null"); + return new RestTemplateBuilder(requestFactorySettings, this.detectRequestFactory, this.rootUri, + this.messageConverters, this.interceptors, this.requestFactoryBuilder, this.uriTemplateHandler, + this.errorHandler, this.basicAuthentication, this.defaultHeaders, this.customizers, + this.requestCustomizers); + } + /** * Sets the connection timeout on the underlying {@link ClientHttpRequestFactory}. * @param connectTimeout the connection timeout diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java index fc617087faf..a49ee833a6d 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/RestTemplateBuilderTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.web.client; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.Arrays; import java.util.Collections; import java.util.Set; @@ -30,6 +31,7 @@ import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.boot.http.client.ClientHttpRequestFactorySettings; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; @@ -272,9 +274,8 @@ class RestTemplateBuilderTests { @Test void requestFactoryWhenFunctionIsNullShouldThrowException() { - assertThatIllegalArgumentException() - .isThrownBy(() -> this.builder - .requestFactory((Function) null)) + assertThatIllegalArgumentException().isThrownBy(() -> this.builder.requestFactory( + (Function) null)) .withMessageContaining("RequestFactoryFunction must not be null"); } @@ -343,6 +344,14 @@ class RestTemplateBuilderTests { assertThat(request.getHeaders()).contains(entry("spring", Collections.singletonList("boot"))); } + @Test + void requestFactorySettingsAppliesSettings() { + ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.defaults() + .withConnectTimeout(Duration.ofSeconds(1)); + RestTemplate template = this.builder.requestFactorySettings(settings).build(); + assertThat(template.getRequestFactory()).extracting("connectTimeout").isEqualTo(1000L); + } + @Test void requestCustomizersAddsCustomizers() { RestTemplate template = this.builder