在 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 中工作?
请您参考如下方法:
在深入挖掘 RestTemplateBuilder
的源代码之后Spring Boot 2.1.x,我发现他们已经删除了方法 requestFactory(ClientHttpRequestFactory requestFactory)
.这意味着您不能再注入(inject) ClientHttpRequestFactory
对象进入 requestFactory
方法。
但是,它接受 Supplier<ClientHttpRequestFactory>
作为现在的输入。所以如果你只有一个restTemplate和一个requestFactory,你需要做的就是注册一个HttpComponentsClientHttpRequestFactory
。 Spring 上下文中的 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 .