Saltar al contenido

RestTemplate personalizado usando requestFactory de RestTemplateBuilder en SpringBoot 2.1.x no es compatible con la versión 1.5.x

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();
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *