You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 17:42:26