Требовался компонент типа «org.apache.hc.client5.http.io.HttpClientConnectionManager», который не удалось найти

Я хочу перенести этот клиентский код 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

Похоже, это проблема с зависимостями. Можете ли вы предоставить подробную информацию о конфигурации ваших зависимостей для httpClient (подробности maven или gradle, в зависимости от того, что вы используете)?

M. Rizzo 17.04.2024 14:50

Какую версию Spring (spring-boot) вы используете? Попробуйте понизить версию вашей client5 до версии 5.2.1 и посмотрите, что произойдет.

M. Rizzo 17.04.2024 16:38

Spring Cloud 2023.0.1, версия Spring Boot: 3.2.4

Peter Penzov 17.04.2024 16:43

завтра создам тестовый проект

Peter Penzov 17.04.2024 16:43

Хорошо. Удачи. Эта версия Spring Boot использует Spring Framework версии 6.1.5 с управляемой зависимостью httpclient5 версии 5.2.3. Итак, попробуйте версию 5.2.3 завтра, ссылка на управляемые зависимости docs.spring.io/spring-boot/docs/current/reference/html/…

M. Rizzo 17.04.2024 18:01

Я добавил полный пример кода. См. выше.

Peter Penzov 17.04.2024 23:24
0
6
412
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо, что поделились своим примером репозитория. Вам необходимо изменить подпись вашего метода restTemplate.

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

Вам не нужно передавать HttpClientConnectionManager, вы создаете PoolingHttpClientConnectionManager в своем методе конфигурации.

Измените сигнатуру метода на

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

Мне удалось запустить проект без каких-либо проблем.

Другие вопросы по теме