Spring boot version: 3.x
Cannot instantiate RestTemplate with HttpComponentsClientHttpRequestFactory, it raises
Caused by: java.lang.IllegalStateException: Request factory org.springframework.http.client.HttpComponentsClientHttpRequestFactory has the setReadTimeout method marked as deprecated
at org.springframework.util.Assert.state(Assert.java:97) ~[spring-core-6.0.9.jar:6.0.9]
at org.springframework.boot.web.client.ClientHttpRequestFactories$Reflective.findMethod(ClientHttpRequestFactories.java:318) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.ClientHttpRequestFactories$Reflective.setReadTimeout(ClientHttpRequestFactories.java:303) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.ClientHttpRequestFactories$Reflective.lambda$configure$1(ClientHttpRequestFactories.java:276) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.context.properties.PropertyMapper$Source.to(PropertyMapper.java:294) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.ClientHttpRequestFactories$Reflective.configure(ClientHttpRequestFactories.java:276) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.ClientHttpRequestFactories$Reflective.get(ClientHttpRequestFactories.java:267) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.ClientHttpRequestFactories.get(ClientHttpRequestFactories.java:130) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.RestTemplateBuilder.lambda$requestFactory$1(RestTemplateBuilder.java:324) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.RestTemplateBuilder.buildRequestFactory(RestTemplateBuilder.java:663) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.RestTemplateBuilder.configure(RestTemplateBuilder.java:629) ~[spring-boot-3.1.0.jar:3.1.0]
at org.springframework.boot.web.client.RestTemplateBuilder.build(RestTemplateBuilder.java:604) ~[spring-boot-3.1.0.jar:3.1.0]
at com.example.demo.RestTemplateConfig.restTemplate(RestTemplateConfig.java:28) ~[classes/:na]
at com.example.demo.RestTemplateConfig$$SpringCGLIB$$0.CGLIB$restTemplate$0(<generated>) ~[classes/:na]
at com.example.demo.RestTemplateConfig$$SpringCGLIB$$2.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:258) ~[spring-core-6.0.9.jar:6.0.9]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-6.0.9.jar:6.0.9]
at com.example.demo.RestTemplateConfig$$SpringCGLIB$$0.restTemplate(<generated>) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:139) ~[spring-beans-6.0.9.jar:6.0.9]
... 20 common frames omitted
It seems related to this ticket https://github.com/spring-projects/spring-boot/issues/32857 but the error still occours Demo: demo.zip
Comment From: wilkinsona
You are providing the request factory which forces an attempt to configure it reflectively. The problem will not occur if you allow Spring Boot to configure things for you:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder.requestFactory(HttpComponentsClientHttpRequestFactory.class)
.setConnectTimeout(Duration.ofSeconds(300))
.setReadTimeout(Duration.ofSeconds(300))
.setBufferRequestBody(true)
.build();
}
Comment From: detomarco
@wilkinsona I tried your option but when I try to log the response in an interceptor
response.body.apply { mark(available()) }
log.debug (response.body.reader().readText() )
response.body.reset()
I get this error
Caused by: java.io.IOException: mark/reset not supported
while they were supported in a previous version
Comment From: wilkinsona
Your sample didn't use an interceptor so I'd missed that requirement. Try this instead:
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return builder
.requestFactory((settings) -> new BufferingClientHttpRequestFactory(
ClientHttpRequestFactories.get(HttpComponentsClientHttpRequestFactory.class, settings)))
.setConnectTimeout(Duration.ofSeconds(300))
.setReadTimeout(Duration.ofSeconds(300))
.build();
}
If you have any further questions, please follow up on Stack Overflow or Gitter. As mentioned in the guidelines for contributing, we prefer to use GitHub issues only for bugs and enhancements.