Skip to content

Commit 88737c2

Browse files
authored
BAEL-9334: Resolving Apache HttpClient Error When Migrating Spring Bo… (#18645)
* BAEL-9334: Resolving Apache HttpClient Error When Migrating Spring Boot Version 2 to 3 * BAEL-9334: Resolving Apache HttpClient Error When Migrating Spring Boot Version 2 to 3 * BAEL-9334: Resolving Apache HttpClient Error When Migrating Spring Boot Version 2 to 3
1 parent 8a6686b commit 88737c2

File tree

3 files changed

+100
-0
lines changed

3 files changed

+100
-0
lines changed

spring-boot-modules/spring-boot-3/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@
8383
<groupId>org.springframework.boot</groupId>
8484
<artifactId>spring-boot-starter-test</artifactId>
8585
</dependency>
86+
87+
<dependency>
88+
<groupId>org.apache.httpcomponents.client5</groupId>
89+
<artifactId>httpclient5</artifactId>
90+
</dependency>
8691
</dependencies>
8792

8893
<profiles>
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package com.baeldung.restclient;
2+
3+
import org.apache.hc.client5.http.config.ConnectionConfig;
4+
import org.apache.hc.client5.http.config.RequestConfig;
5+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
6+
import org.apache.hc.client5.http.impl.classic.HttpClients;
7+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
8+
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder;
9+
import org.apache.hc.core5.http.io.SocketConfig;
10+
import org.apache.hc.core5.util.Timeout;
11+
import org.springframework.context.annotation.Bean;
12+
import org.springframework.context.annotation.Configuration;
13+
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
14+
import org.springframework.web.client.RestTemplate;
15+
16+
@Configuration
17+
public class RestTemplateConfiguration {
18+
19+
@Bean
20+
public RestTemplate restTemplate() {
21+
try {
22+
// Timeout configurations
23+
SocketConfig socketConfig = SocketConfig.custom()
24+
.setSoTimeout(Timeout.ofSeconds(30)) // Read timeout
25+
.build();
26+
27+
ConnectionConfig connectionConfig = ConnectionConfig.custom()
28+
.setConnectTimeout(Timeout.ofSeconds(30)) // Connect timeout
29+
.build();
30+
31+
RequestConfig requestConfig = RequestConfig.custom()
32+
.setConnectionRequestTimeout(Timeout.ofSeconds(30)) // Pool wait timeout
33+
.build();
34+
35+
// Connection pool configuration
36+
PoolingHttpClientConnectionManager connectionManager =
37+
PoolingHttpClientConnectionManagerBuilder.create()
38+
.setMaxConnPerRoute(20)
39+
.setMaxConnTotal(100)
40+
.setDefaultSocketConfig(socketConfig)
41+
.setDefaultConnectionConfig(connectionConfig)
42+
.build();
43+
44+
CloseableHttpClient httpClient = HttpClients.custom()
45+
.setConnectionManager(connectionManager)
46+
.setDefaultRequestConfig(requestConfig)
47+
.build();
48+
49+
return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
50+
51+
} catch (Exception e) {
52+
throw new IllegalStateException("Failed to configure RestTemplate", e);
53+
}
54+
}
55+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.baeldung.restclient;
2+
3+
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
4+
import org.junit.jupiter.api.Test;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.boot.test.context.SpringBootTest;
7+
import org.springframework.context.ApplicationContext;
8+
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
9+
import org.springframework.test.context.ContextConfiguration;
10+
import org.springframework.web.client.RestTemplate;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
14+
@SpringBootTest
15+
@ContextConfiguration(classes = RestTemplateConfiguration.class)
16+
public class RestTemplateConfigurationUnitTest {
17+
18+
@Autowired
19+
private ApplicationContext context;
20+
21+
@Test
22+
public void givenSpringContext_whenRestTemplateBeanRetrieved_thenReturnsProperlyConfiguredInstance() {
23+
// When - We retrieve the RestTemplate bean
24+
RestTemplate restTemplate = context.getBean(RestTemplate.class);
25+
26+
// Then - Verify it's properly configured
27+
assertThat(restTemplate)
28+
.isNotNull()
29+
.extracting(RestTemplate::getRequestFactory)
30+
.isInstanceOf(HttpComponentsClientHttpRequestFactory.class);
31+
32+
HttpComponentsClientHttpRequestFactory factory =
33+
(HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
34+
35+
assertThat(factory.getHttpClient())
36+
.isInstanceOfSatisfying(CloseableHttpClient.class, client -> {
37+
assertThat(client).isNotNull();
38+
});
39+
}
40+
}

0 commit comments

Comments
 (0)