web-dev-qa-db-ja.com

SpringBoot 2.1.xでRestTemplateBuilderのrequestFactoryを使用するカスタムRestTemplateには、バージョン1.5.xとの下位互換性がありません

Spring Boot 1.5.xでは、以下のようなカスタムRestTemplateを作成していました。

@Bean
  public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
    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 restTemplateBuilder.requestFactory(clientHttpRequestFactory).build();
  }

しかし、Spring Boot 2.1.xに移行した後、上記のコードはコンパイルされません。 requestFactoryHttpComponentsClientHttpRequestFactoryを入力パラメーターとして受け取らないように見えます。

Spring Boot 2.1.xで上記のコードをどのように達成できますか?

7
Sahil Chhabra

Spring Boot 2.1.xRestTemplateBuilderのソースコードをさらに掘り下げた後、メソッドrequestFactory(ClientHttpRequestFactory requestFactory)が削除されていることがわかりました。つまり、ClientHttpRequestFactoryオブジェクトをrequestFactoryメソッドに挿入できなくなります。

ただし、Supplier<ClientHttpRequestFactory>を入力として。したがって、restTemplateとrequestFactoryが1つしかない場合、SpringコンテキストでHttpComponentsClientHttpRequestFactory Beanを登録し、ClientHttpRequestFactorySupplierrequestFactoryメソッドに渡すだけです。サプライヤはHttpComponentsClientHttpRequestFactoryを自動的に検出し、必要なRestTemplateを返します。

以下のコードを参照してください:

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

SpringBoot 2.1.xでRestTemplateBuilderに加えられたすべての変更に関心がある場合は、 this を参照してください。

8
Sahil Chhabra

異なるrequestFactoriesを必要とする複数のrestTemplatesがある場合(最初に見つかったものの自動注入ではない場合)、より一般的なソリューションを次に示します。

@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;
    }

  }

}
1
Tristan