Я хочу перенести этот клиентский код 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) вы используете? Попробуйте понизить версию вашей client5 до версии 5.2.1 и посмотрите, что произойдет.
Spring Cloud 2023.0.1, версия Spring Boot: 3.2.4
завтра создам тестовый проект
Хорошо. Удачи. Эта версия Spring Boot использует Spring Framework версии 6.1.5 с управляемой зависимостью httpclient5 версии 5.2.3. Итак, попробуйте версию 5.2.3 завтра, ссылка на управляемые зависимости docs.spring.io/spring-boot/docs/current/reference/html/…
Я добавил полный пример кода. См. выше.
Спасибо, что поделились своим примером репозитория. Вам необходимо изменить подпись вашего метода restTemplate.
@Bean
public RestTemplate restTemplate(HttpClientConnectionManager httpClientConnectionManager)
throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
Вам не нужно передавать HttpClientConnectionManager, вы создаете PoolingHttpClientConnectionManager в своем методе конфигурации.
Измените сигнатуру метода на
@Bean
public RestTemplate restTemplate()
throws KeyManagementException, NoSuchAlgorithmException, KeyStoreException {
Мне удалось запустить проект без каких-либо проблем.
Похоже, это проблема с зависимостями. Можете ли вы предоставить подробную информацию о конфигурации ваших зависимостей для httpClient (подробности maven или gradle, в зависимости от того, что вы используете)?