Skip to content

RestTemplate builder: HttpComponentsClientHttpRequestFactory has the setReadTimeout method marked as deprecated #35658

@detomarco

Description

@detomarco

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 #32857 but the error still occours
Demo:
demo.zip

Activity

wilkinsona

wilkinsona commented on May 30, 2023

@wilkinsona
Member

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();
}
detomarco

detomarco commented on Jun 17, 2023

@detomarco
Author

@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

wilkinsona

wilkinsona commented on Jun 18, 2023

@wilkinsona
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    status: invalidAn issue that we don't feel is valid

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @wilkinsona@detomarco@spring-projects-issues

        Issue actions

          RestTemplate builder: HttpComponentsClientHttpRequestFactory has the setReadTimeout method marked as deprecated · Issue #35658 · spring-projects/spring-boot