Spring Boot3中RestTemplate的HttpComponentsClientHttpRequestFactory兼容问题求解
问题根源
Spring Boot 3 升级后,org.springframework.http.client.HttpComponentsClientHttpRequestFactory 依赖的是 Apache HttpClient 5.x(包路径为 org.apache.hc.client5.*),而你的代码仍在使用旧版 HttpClient 4.x 的类(包路径 org.apache.http.*),导致类型不匹配,出现报错:
'HttpComponentsClientHttpRequestFactory(org.apache.hc.client5.http.classic.HttpClient)' in 'org.springframework.http.client.HttpComponentsClientHttpRequestFactory' cannot be applied to '(org.apache.http.client.HttpClient)'
解决步骤
1. 确保引入 HttpClient 5.x 依赖
如果使用 Maven,引入 Spring Boot 提供的 HttpClient 5 starter(自动管理版本):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-httpclient</artifactId> </dependency>
2. 替换代码中的旧版 HttpClient 类
将所有 org.apache.http.* 相关的导入和代码替换为 HttpClient 5.x 的对应类:
修正后的导入:
import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.binder.httpcomponents.hc5.PoolingHttpClientConnectionManagerMetricsBinder; import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; import org.apache.hc.client5.http.impl.classic.HttpClientBuilder; import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
修正后的 HttpClient 构造代码:
// 初始化 HttpClient 5.x 的连接管理器 PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(); // 根据业务需求配置连接池参数 connectionManager.setMaxTotal(200); connectionManager.setDefaultMaxPerRoute(50); // 构建 HttpClient 5.x 的 CloseableHttpClient 实例 CloseableHttpClient httpClient = HttpClientBuilder.create() .setConnectionManager(connectionManager) .build(); // 绑定 Micrometer 监控(使用 HttpClient 5 专属的 MetricsBinder) new PoolingHttpClientConnectionManagerMetricsBinder(connectionManager, "my-pool").bindTo(registry); // 初始化兼容的请求工厂 HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
额外说明
如果你的项目使用 Spring Boot 自动配置,只需引入 spring-boot-starter-httpclient 依赖,Spring 会自动注入 CloseableHttpClient 实例,直接拿来构造 HttpComponentsClientHttpRequestFactory 即可,无需手动构建连接管理器和客户端。
内容的提问来源于stack exchange,提问作者ayisha farhin

