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に移行した後、上記のコードはコンパイルされません。 requestFactory
はHttpComponentsClientHttpRequestFactory
を入力パラメーターとして受け取らないように見えます。
Spring Boot 2.1.xで上記のコードをどのように達成できますか?
Spring Boot 2.1.xのRestTemplateBuilder
のソースコードをさらに掘り下げた後、メソッドrequestFactory(ClientHttpRequestFactory requestFactory)
が削除されていることがわかりました。つまり、ClientHttpRequestFactory
オブジェクトをrequestFactory
メソッドに挿入できなくなります。
ただし、Supplier<ClientHttpRequestFactory>
を入力として。したがって、restTemplateとrequestFactoryが1つしかない場合、SpringコンテキストでHttpComponentsClientHttpRequestFactory
Beanを登録し、ClientHttpRequestFactorySupplier
をrequestFactory
メソッドに渡すだけです。サプライヤは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 を参照してください。
異なる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;
}
}
}