Solución:
Después de profundizar en el código fuente de RestTemplateBuilder
de Spring Boot 2.1.x, Encontré que han eliminado el método requestFactory(ClientHttpRequestFactory requestFactory)
. Eso significa que ya no puede inyectar el ClientHttpRequestFactory
objeto en requestFactory
método.
Pero, acepta un Supplier<ClientHttpRequestFactory>
como entrada ahora. Entonces, si solo tiene una restTemplate y una requestFactory, todo lo que necesita hacer es registrar una HttpComponentsClientHttpRequestFactory
bean en el contexto de Spring y pasar un ClientHttpRequestFactorySupplier
para requestFactory
método. El proveedor detectará automáticamente su HttpComponentsClientHttpRequestFactory
y devolverle la RestTemplate requerida.
Consulte el siguiente código para eso:
@Bean
public HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory() {
PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager();
poolingConnectionManager.setMaxTotal(restTemplateProps.getMaxConnectionsPerPool());
poolingConnectionManager.setDefaultMaxPerRoute(restTemplateProps.getMaxDefaultConnectionPerRoute());
CloseableHttpClient client = HttpClientBuilder.create().setConnectionManager(poolingConnectionManager).build();
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory =
new HttpComponentsClientHttpRequestFactory(client);
clientHttpRequestFactory.setConnectTimeout(restTemplateProps.getConnectionTimeout());
clientHttpRequestFactory.setReadTimeout(restTemplateProps.getSocketTimeout());
return clientHttpRequestFactory;
}
@Bean
public RestTemplate authRestTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder.requestFactory(new ClientHttpRequestFactorySupplier()).build();
}
Para aquellos que estén interesados en todos los cambios realizados en RestTemplateBuilder en SpringBoot 2.1.x, consulte esto.
Aquí hay una solución más general si tiene varias restTemplates que necesitan diferentes requestFactories (y no una autoinyección de la primera encontrada):
@Configuration
public class Config {
@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder, ApplicationContext ctx) {
return builder.requestFactory(new MyRequestFactorySupplier()).build();
}
class MyRequestFactorySupplier implements Supplier<ClientHttpRequestFactory> {
@Override
public ClientHttpRequestFactory get() {
// Using Apache HTTP client.
HttpClientBuilder clientBuilder = HttpClientBuilder.create();
HttpClient httpClient = clientBuilder.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
requestFactory.setBufferRequestBody(false); // When sending large amounts of data via POST or PUT, it is recommended to change this property to false, so as not to run out of memory.
return requestFactory;
}
}
}
O incluso más fácil, simplemente:
restTemplatebuilder.requestFactory(() -> new
HttpComponentsClientHttpRequestFactory(httpClient)).build();