diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/ClientHttpRequestFactories.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/ClientHttpRequestFactories.java index 9fc047382ff..9f658858ec2 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/ClientHttpRequestFactories.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/web/client/ClientHttpRequestFactories.java @@ -329,7 +329,7 @@ public final class ClientHttpRequestFactories { */ private static class SimpleClientHttpsRequestFactory extends SimpleClientHttpRequestFactory { - private SslBundle sslBundle; + private final SslBundle sslBundle; SimpleClientHttpsRequestFactory(SslBundle sslBundle) { this.sslBundle = sslBundle; @@ -385,13 +385,23 @@ public final class ClientHttpRequestFactories { } private static void setConnectTimeout(ClientHttpRequestFactory factory, Duration connectTimeout) { - Method method = findMethod(factory, "setConnectTimeout", int.class); + Method method = tryFindMethod(factory, "setConnectTimeout", Duration.class); + if (method != null) { + invoke(factory, method, connectTimeout); + return; + } + method = findMethod(factory, "setConnectTimeout", int.class); int timeout = Math.toIntExact(connectTimeout.toMillis()); invoke(factory, method, timeout); } private static void setReadTimeout(ClientHttpRequestFactory factory, Duration readTimeout) { - Method method = findMethod(factory, "setReadTimeout", int.class); + Method method = tryFindMethod(factory, "setReadTimeout", Duration.class); + if (method != null) { + invoke(factory, method, readTimeout); + return; + } + method = findMethod(factory, "setReadTimeout", int.class); int timeout = Math.toIntExact(readTimeout.toMillis()); invoke(factory, method, timeout); } @@ -407,6 +417,18 @@ public final class ClientHttpRequestFactories { return method; } + private static Method tryFindMethod(ClientHttpRequestFactory requestFactory, String methodName, + Class... parameters) { + Method method = ReflectionUtils.findMethod(requestFactory.getClass(), methodName, parameters); + if (method == null) { + return null; + } + if (method.isAnnotationPresent(Deprecated.class)) { + return null; + } + return method; + } + private static void invoke(ClientHttpRequestFactory requestFactory, Method method, Object... parameters) { ReflectionUtils.invokeMethod(method, requestFactory, parameters); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java index 272cd9a19de..9741bf4e68b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/web/client/AbstractClientHttpRequestFactoriesTests.java @@ -27,6 +27,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -101,6 +102,26 @@ abstract class AbstractClientHttpRequestFactoriesTests ClientHttpRequestFactories.get(this.requestFactoryType, settings), settings); + assertThat(connectTimeout(requestFactory)).isEqualTo(1000); + } + + @Test + void shouldSetReadTimeoutsWhenUsingReflective() { + Assumptions.assumeTrue(supportsSettingReadTimeout()); + ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.DEFAULTS + .withReadTimeout(Duration.ofSeconds(2)); + T requestFactory = ClientHttpRequestFactories + .get(() -> ClientHttpRequestFactories.get(this.requestFactoryType, settings), settings); + assertThat(readTimeout(requestFactory)).isEqualTo(2000); + } + @ParameterizedTest @ValueSource(strings = { "GET", "POST" }) void connectWithSslBundle(String httpMethod) throws Exception { @@ -136,8 +157,12 @@ abstract class AbstractClientHttpRequestFactoriesTests