From 66c112936eb52a71a7b5aec4ed95d4f836fa4d6d Mon Sep 17 00:00:00 2001 From: Moritz Halbritter Date: Fri, 17 Oct 2025 14:26:48 +0200 Subject: [PATCH] Add runtime hints for timeout methods with Duration overloads Closes gh-47675 --- .../ClientHttpRequestFactoryRuntimeHints.java | 3 ++ ...ntHttpRequestFactoryRuntimeHintsTests.java | 37 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHints.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHints.java index 4c365ac30b1..90fcd1f1bc2 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHints.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHints.java @@ -19,6 +19,7 @@ package org.springframework.boot.http.client; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.net.HttpURLConnection; +import java.time.Duration; import org.springframework.aot.hint.ExecutableMode; import org.springframework.aot.hint.ReflectionHints; @@ -87,7 +88,9 @@ class ClientHttpRequestFactoryRuntimeHints implements RuntimeHintsRegistrar { private void registerReflectionHints(ReflectionHints hints, Class requestFactoryType, Class readTimeoutType) { registerMethod(hints, requestFactoryType, "setConnectTimeout", int.class); + registerMethod(hints, requestFactoryType, "setConnectTimeout", Duration.class); registerMethod(hints, requestFactoryType, "setReadTimeout", readTimeoutType); + registerMethod(hints, requestFactoryType, "setReadTimeout", Duration.class); } private void registerMethod(ReflectionHints hints, Class requestFactoryType, diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHintsTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHintsTests.java index 8c41780b622..cdda7d51a6b 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHintsTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/http/client/ClientHttpRequestFactoryRuntimeHintsTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.http.client; import java.lang.reflect.Field; import java.lang.reflect.Method; +import java.time.Duration; import org.junit.jupiter.api.Test; @@ -26,6 +27,7 @@ import org.springframework.aot.hint.predicate.ReflectionHintsPredicates; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; import org.springframework.http.client.AbstractClientHttpRequestFactoryWrapper; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.http.client.JdkClientHttpRequestFactory; import org.springframework.http.client.JettyClientHttpRequestFactory; import org.springframework.http.client.ReactorClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; @@ -60,6 +62,15 @@ class ClientHttpRequestFactoryRuntimeHintsTests { assertThat(reflection .onMethod(method(HttpComponentsClientHttpRequestFactory.class, "setConnectTimeout", int.class))) .accepts(hints); + assertThat(reflection + .onMethod(method(HttpComponentsClientHttpRequestFactory.class, "setConnectTimeout", Duration.class))) + .accepts(hints); + assertThat( + reflection.onMethod(method(HttpComponentsClientHttpRequestFactory.class, "setReadTimeout", int.class))) + .accepts(hints); + assertThat(reflection + .onMethod(method(HttpComponentsClientHttpRequestFactory.class, "setReadTimeout", Duration.class))) + .accepts(hints); } @Test @@ -69,8 +80,13 @@ class ClientHttpRequestFactoryRuntimeHintsTests { ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); assertThat(reflection.onMethod(method(JettyClientHttpRequestFactory.class, "setConnectTimeout", int.class))) .accepts(hints); + assertThat( + reflection.onMethod(method(JettyClientHttpRequestFactory.class, "setConnectTimeout", Duration.class))) + .accepts(hints); assertThat(reflection.onMethod(method(JettyClientHttpRequestFactory.class, "setReadTimeout", long.class))) .accepts(hints); + assertThat(reflection.onMethod(method(JettyClientHttpRequestFactory.class, "setReadTimeout", Duration.class))) + .accepts(hints); } @Test @@ -80,8 +96,13 @@ class ClientHttpRequestFactoryRuntimeHintsTests { ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); assertThat(reflection.onMethod(method(ReactorClientHttpRequestFactory.class, "setConnectTimeout", int.class))) .accepts(hints); + assertThat( + reflection.onMethod(method(ReactorClientHttpRequestFactory.class, "setConnectTimeout", Duration.class))) + .accepts(hints); assertThat(reflection.onMethod(method(ReactorClientHttpRequestFactory.class, "setReadTimeout", long.class))) .accepts(hints); + assertThat(reflection.onMethod(method(ReactorClientHttpRequestFactory.class, "setReadTimeout", Duration.class))) + .accepts(hints); } @Test @@ -91,8 +112,24 @@ class ClientHttpRequestFactoryRuntimeHintsTests { ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); assertThat(reflection.onMethod(method(SimpleClientHttpRequestFactory.class, "setConnectTimeout", int.class))) .accepts(hints); + assertThat( + reflection.onMethod(method(SimpleClientHttpRequestFactory.class, "setConnectTimeout", Duration.class))) + .accepts(hints); assertThat(reflection.onMethod(method(SimpleClientHttpRequestFactory.class, "setReadTimeout", int.class))) .accepts(hints); + assertThat(reflection.onMethod(method(SimpleClientHttpRequestFactory.class, "setReadTimeout", Duration.class))) + .accepts(hints); + } + + @Test + void shouldRegisterJdkHttpHints() { + RuntimeHints hints = new RuntimeHints(); + new ClientHttpRequestFactoryRuntimeHints().registerHints(hints, getClass().getClassLoader()); + ReflectionHintsPredicates reflection = RuntimeHintsPredicates.reflection(); + assertThat(reflection.onMethod(method(JdkClientHttpRequestFactory.class, "setReadTimeout", int.class))) + .accepts(hints); + assertThat(reflection.onMethod(method(JdkClientHttpRequestFactory.class, "setReadTimeout", Duration.class))) + .accepts(hints); } private static Method method(Class target, String name, Class... parameterTypes) {