Apache HttpClient5迁移报错:找不到HttpClientConnectionManager Bean
问题描述
从旧版Apache HttpClient迁移至Apache HttpClient5(版本5.3.1)后,配置RestTemplate Bean时启动报错:
required a bean of type 'org.apache.hc.client5.http.io.HttpClientConnectionManager' that could not be found.
原代码中restTemplate方法依赖注入了HttpClientConnectionManager参数,但迁移后的代码已经自行构建了PoolingHttpClientConnectionManager,导致Spring无法找到对应的Bean注入。
解决方案
直接移除方法参数中的HttpClientConnectionManager httpClientConnectionManager,因为当前代码内部已经通过PoolingHttpClientConnectionManagerBuilder创建了连接管理器,不需要外部注入该Bean。同时需要修正代码中未定义的connectTimeout变量问题。
修正后的完整代码
import org.apache.hc.client5.http.config.ConnectionConfig; import org.apache.hc.client5.http.config.RequestConfig; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClients; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactory; import org.apache.hc.core5.http.io.SocketConfig; import org.apache.hc.core5.ssl.TrustStrategy; import org.apache.hc.core5.util.Timeout; import org.springframework.http.client.BufferingClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; import javax.net.ssl.SSLContext; import java.security.KeyManagementException; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.X509Certificate; @Bean public RestTemplate restTemplate() throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException { ConnectionConfig connectionConfig = ConnectionConfig.custom() .setConnectTimeout(Timeout.ofMilliseconds(20)) .build(); SocketConfig socketConfig = SocketConfig.custom() .setSoTimeout(Timeout.ofMilliseconds(20)) .build(); RequestConfig requestConfig = RequestConfig.custom() .setConnectionRequestTimeout(Timeout.ofMilliseconds(20)) .build(); TrustStrategy trustStrategy = (X509Certificate[] chain, String authType) -> true; SSLContext sslContext = org.apache.hc.core5.ssl.SSLContexts.custom().loadTrustMaterial(null, trustStrategy).build(); SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() .setDefaultSocketConfig(socketConfig) .setDefaultConnectionConfig(connectionConfig) .setSSLSocketFactory(csf).build(); CloseableHttpClient httpClient = HttpClients.custom() .setConnectionManager(connectionManager) .setDefaultRequestConfig(requestConfig) .build(); HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); // 移除未定义的connectTimeout,连接超时已通过ConnectionConfig配置 requestFactory.setHttpClient(httpClient); return new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory)); }
关键说明
- 移除外部注入的
HttpClientConnectionManager参数,避免Spring找不到对应Bean的错误。 - 代码中已通过
PoolingHttpClientConnectionManagerBuilder构建了带SSL配置的连接管理器,无需外部依赖。 - 修正了原代码中
requestFactory.setConnectTimeout(connectTimeout)的错误,该变量未定义,且连接超时已通过ConnectionConfig配置,可直接移除该行。
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

