升级Spring Boot 2.5.6后HttpComponentsClientHttpRequestFactory不兼容HttpClient5求助
Spring Boot 2.5.6 与 HttpClient5、ehCache3 适配冲突解决方案
核心根因
Spring Web 5.3.x(对应Spring Boot 2.5.x)默认提供的HttpComponentsClientHttpRequestFactory仅支持HttpClient 4.x版本,不兼容HttpClient 5.x的org.apache.hc.client5.http.classic.HttpClient接口。Spring官方直到Spring Framework 6才将HttpClient 5的适配设为默认实现,但5.3.12版本已内置专用适配类,可直接使用。
可落地解决方案
方案1:使用内置HttpClient5专用请求工厂(改动最小)
Spring Web 5.3.12已经内置了HttpComponents5ClientHttpRequestFactory类,原生支持HttpClient 5.x接口,直接替换原有请求工厂即可:
import org.springframework.http.client.HttpComponents5ClientHttpRequestFactory; 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.cache.ehcache.EhcacheHttpCacheStorage; // 1. 初始化绑定ehCache3的HttpClient5实例 CloseableHttpClient cachedHttpClient = HttpClients.custom() .setCacheStorage(new EhcacheHttpCacheStorage(你的EhCache缓存实例)) .build(); // 2. 初始化适配HttpClient5的请求工厂 HttpComponents5ClientHttpRequestFactory factory = new HttpComponents5ClientHttpRequestFactory(cachedHttpClient); // 3. 初始化RestTemplate RestTemplate restTemplate = new RestTemplate(factory);
注意:需要排除项目中传递引入的HttpClient 4.x依赖,避免类冲突
方案2:保留HttpClient 4.x,适配ehCache3
如果暂时不想调整HttpClient大版本,可以降级使用HttpClient 4.5.x系列,自定义缓存存储对接ehCache3:
- 引入
org.apache.httpcomponents:httpclient-cache:4.5.14依赖 - 实现
org.apache.http.client.cache.HttpCacheStorage接口,将缓存读写逻辑对接至你的ehCache3实例 - 使用原生
HttpComponentsClientHttpRequestFactory初始化RestTemplate即可
方案3:升级Spring Boot至2.7.x稳定版
Spring Boot 2.7.x版本已内置HttpClient 5的自动配置支持,无需手动编写请求工厂适配逻辑,框架会自动识别绑定了ehCache的HttpClient实例并注入到RestTemplate中,无其他破坏性依赖变更。
内容的提问来源于stack exchange,提问作者Buks van der Lingen
相关产品推荐
相关产品推荐

