Skip to content

Commit 73a59f8

Browse files
committed
Compatibilty with Spring Cloud Sleuth, which doesn´t work with multiple HttpComponentsHttpClientRequestFactory Beans
1 parent a99cef2 commit 73a59f8

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,44 @@
11
package de.jonashackt.client;
22

3+
import org.apache.http.client.HttpClient;
4+
import org.apache.http.impl.client.HttpClients;
35
import org.springframework.beans.factory.annotation.Autowired;
46
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
57
import org.springframework.stereotype.Component;
68
import org.springframework.web.client.RestTemplate;
79

10+
import javax.net.ssl.SSLContext;
11+
812
@Component
913
public class ServerClientImpl implements ServerClient {
1014

1115
@Autowired
12-
private HttpComponentsClientHttpRequestFactory serverAliceClientHttpRequestFactory;
16+
private SSLContext serverTomSSLContext;
1317

1418
@Autowired
15-
private HttpComponentsClientHttpRequestFactory serverTomClientHttpRequestFactory;
19+
private SSLContext serverAliceSSLContext;
1620

1721
private RestTemplate restTemplate = new RestTemplate();
1822

1923
@Override
2024
public String callServerAlice() {
21-
restTemplate.setRequestFactory(serverAliceClientHttpRequestFactory);
25+
restTemplate.setRequestFactory(createHttpComponentsClientHttpRequestFactory(serverAliceSSLContext));
2226

2327
return restTemplate.getForObject("https://server-alice:8443/hello", String.class);
2428
}
2529

2630
@Override
2731
public String callServerTom() {
28-
restTemplate.setRequestFactory(serverTomClientHttpRequestFactory);
32+
restTemplate.setRequestFactory(createHttpComponentsClientHttpRequestFactory(serverTomSSLContext));
2933

3034
return restTemplate.getForObject("https://server-tom:8443/hello", String.class);
3135
}
36+
37+
private HttpComponentsClientHttpRequestFactory createHttpComponentsClientHttpRequestFactory(SSLContext sslContext) {
38+
HttpClient client = HttpClients.custom()
39+
.setSSLContext(sslContext)
40+
.build();
41+
42+
return new HttpComponentsClientHttpRequestFactory(client);
43+
}
3244
}

client-bob/src/main/java/de/jonashackt/configuration/RestClientCertConfiguration.java

+11-17
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class RestClientCertConfiguration {
1919

2020
private char[] bobPassword = "bobpassword".toCharArray();
2121
private char[] tomPassword = "tompassword".toCharArray();
22+
private char[] alicePassword = "alicepassword".toCharArray();
2223

2324
@Value("classpath:alice-keystore.p12")
2425
private Resource aliceKeystoreResource;
@@ -28,38 +29,31 @@ public class RestClientCertConfiguration {
2829

2930
@Value("classpath:client-truststore.jks")
3031
private Resource truststoreResource;
31-
private char[] alicePassword = "alicepassword".toCharArray();
3232

3333
@Bean
34-
public HttpComponentsClientHttpRequestFactory serverTomClientHttpRequestFactory() throws Exception {
35-
SSLContext sslContext = SSLContextBuilder
34+
public SSLContext serverTomSSLContext() throws Exception {
35+
return SSLContextBuilder
3636
.create()
3737
.loadKeyMaterial(inStream2File(tomKeystoreResource), tomPassword, tomPassword)
3838
.loadTrustMaterial(inStream2File(truststoreResource), bobPassword)
3939
.build();
40-
41-
HttpClient client = HttpClients.custom()
42-
.setSSLContext(sslContext)
43-
.build();
44-
45-
return new HttpComponentsClientHttpRequestFactory(client);
4640
}
4741

4842
@Bean
49-
public HttpComponentsClientHttpRequestFactory serverAliceClientHttpRequestFactory() throws Exception {
50-
SSLContext sslContext = SSLContextBuilder
43+
public SSLContext serverAliceSSLContext() throws Exception {
44+
return SSLContextBuilder
5145
.create()
5246
.loadKeyMaterial(inStream2File(aliceKeystoreResource), alicePassword, alicePassword)
5347
.loadTrustMaterial(inStream2File(truststoreResource), bobPassword)
5448
.build();
55-
56-
HttpClient client = HttpClients.custom()
57-
.setSSLContext(sslContext)
58-
.build();
59-
60-
return new HttpComponentsClientHttpRequestFactory(client);
6149
}
6250

51+
52+
/**
53+
* The ugly need to generate a File from a InputStream - because SSLContextBuild.loadKeyMaterial only accepts File,
54+
* but retrieving Files from within Spring Boot Fatjars is only possible through Resources ->
55+
* see https://stackoverflow.com/questions/25869428/classpath-resource-not-found-when-running-as-jar
56+
*/
6357
private File inStream2File(Resource resource) {
6458
try {
6559
File tempFile = File.createTempFile("file", ".tmp");

0 commit comments

Comments
 (0)