需要一个类型为“org.apache.hc.client5.http.io.HttpClientConnectionManager”的bean,但无法找到

问题描述 投票:0回答:1

我想迁移这个apache http客户端代码:

import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.TrustStrategy;

  @Bean
  public RestTemplate restTemplate(HttpClientConnectionManager httpClientConnectionManager)
      throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
    TrustStrategy trustStrategy = (X509Certificate[] chain, String authType) -> true;
    SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom().loadTrustMaterial(null, trustStrategy).build();
    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
    CloseableHttpClient httpClient = HttpClients.custom()
                                                .setConnectionManager(httpClientConnectionManager)
                                                .setSSLSocketFactory(csf)
                                                .build();
    HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
    requestFactory.setConnectTimeout(20);
    requestFactory.setReadTimeout(20);
    requestFactory.setHttpClient(httpClient);
    return new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
  }

我尝试将此代码迁移到 apache http 5 代码:

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.io.HttpClientConnectionManager;
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;

  @Bean
  public RestTemplate restTemplate(HttpClientConnectionManager httpClientConnectionManager)
      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();
    requestFactory.setConnectTimeout(connectTimeout);
    requestFactory.setHttpClient(httpClient);
    return new RestTemplate(new BufferingClientHttpRequestFactory(requestFactory));
  }

在启动过程中出现错误:

required a bean of type 'org.apache.hc.client5.http.io.HttpClientConnectionManager' that could not be found.

更换

HttpClientConnectionManager httpClientConnectionManager
的正确方法是什么?我应该更换它还是直接删除它?

我用

implementation 'org.apache.httpcomponents.client5:httpclient5:5.3.1'

完整代码示例:https://github.com/rcbandit111/apache_http5_client_migration_poc/blob/main/src/main/java/com/test/client/ClientConfiguration.java

spring spring-boot apache-httpclient-4.x apache-httpclient-5.x
1个回答
0
投票

感谢您分享您的示例存储库。您需要更改restTemplate方法的签名。

@Bean
  public RestTemplate restTemplate(HttpClientConnectionManager httpClientConnectionManager)
      throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {

您不需要传入 HttpClientConnectionManager,您可以在配置方法中创建 PoolingHttpClientConnectionManager。

将方法签名更改为

@Bean
  public RestTemplate restTemplate()
      throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {

我能够毫无问题地启动该项目。

© www.soinside.com 2019 - 2024. All rights reserved.