HttpComponentsClientHttpRequestFactory不兼容CloseableHttpClient参数求助
解决RestTemplate跳过SSL校验时HttpComponentsClientHttpRequestFactory参数类型不匹配问题
问题根源
你遇到的类型不匹配问题核心是依赖版本冲突:同时引入了Apache HttpClient 5.x(httpclient5)和HttpClient 4.x(httpclient)两个版本的依赖,这两个版本的CloseableHttpClient分属不同包路径,而Spring的HttpComponentsClientHttpRequestFactory默认适配HttpClient 4.x的API,导致参数类型不兼容。
解决方案
提供两种可行方案,按需选择:
方案一:统一使用Apache HttpClient 4.x(推荐,适配现有Spring版本)
- 清理依赖:移除HttpClient 5.x的依赖,保留4.x版本
修改pom.xml,删除以下依赖:
<dependency> <groupId>org.apache.httpcomponents.client5</groupId> <artifactId>httpclient5</artifactId> <version>5.2</version> </dependency>
确保保留HttpClient 4.x的依赖:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency>
- 验证导入:确保SSL相关类为4.x包路径
import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.conn.ssl.NoopHostnameVerifier;
- 原代码可直接运行:此时
CloseableHttpClient为4.x类型,与HttpComponentsClientHttpRequestFactory的构造参数完全兼容。
方案二:使用Apache HttpClient 5.x对应的Spring工厂类
如果需要保留HttpClient 5.x,需使用Spring专门适配的工厂类:
- 清理依赖:移除所有HttpClient 4.x相关依赖
修改pom.xml,删除以下依赖:
<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpcore</artifactId> <version>4.4.13</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient-cache</artifactId> <version>4.5.13</version> </dependency>
- 调整代码:使用适配HttpClient 5.x的请求工厂类
import org.springframework.http.client.HttpComponentsClient5HttpRequestFactory; // 其他导入保持不变 SSLContext sslContext = SSLContextBuilder.create() .loadTrustMaterial((chain, authType) -> true) .build(); CloseableHttpClient httpClient = HttpClients.custom() .setSSLContext(sslContext) .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE) .build(); // 替换为HttpClient5专属的工厂类 HttpComponentsClient5HttpRequestFactory factory = new HttpComponentsClient5HttpRequestFactory(httpClient); RestTemplate restTemplate = new RestTemplate(factory);
重要提醒
跳过SSL证书校验仅适合测试/学校项目场景,生产环境绝对禁止使用,会导致严重的安全风险。
内容的提问来源于stack exchange,提问作者user24824026
相关产品推荐
相关产品推荐

