diff --git a/spring-vault-core/src/main/java/org/springframework/vault/client/VaultClients.java b/spring-vault-core/src/main/java/org/springframework/vault/client/VaultClients.java index 32246e2f..7ac5f8f5 100644 --- a/spring-vault-core/src/main/java/org/springframework/vault/client/VaultClients.java +++ b/spring-vault-core/src/main/java/org/springframework/vault/client/VaultClients.java @@ -17,6 +17,8 @@ package org.springframework.vault.client; import java.io.IOException; import java.net.URI; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import org.springframework.http.HttpRequest; @@ -24,6 +26,10 @@ import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.http.converter.StringHttpMessageConverter; +import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriTemplateHandler; @@ -46,18 +52,50 @@ public class VaultClients { * request body size that is required to send a * {@link org.springframework.http.HttpHeaders#CONTENT_LENGTH} request header. * Otherwise, Vault will deny body processing. + *

+ * Requires Jackson 2 for Object-to-JSON mapping. * * @param endpoint must not be {@literal null}. * @param requestFactory must not be {@literal null}. * @return the {@link RestTemplate}. * @see org.springframework.http.client.Netty4ClientHttpRequestFactory + * @see MappingJackson2HttpMessageConverter */ public static RestTemplate createRestTemplate(VaultEndpoint endpoint, ClientHttpRequestFactory requestFactory) { - RestTemplate restTemplate = new RestTemplate(requestFactory); + RestTemplate restTemplate = createRestTemplate(); + restTemplate.setRequestFactory(requestFactory); restTemplate.setUriTemplateHandler(createUriTemplateHandler(endpoint)); + + return restTemplate; + } + + /** + * Create a {@link RestTemplate} for Vault interaction. {@link RestTemplate} is + * configured with a {@link ClientHttpRequestInterceptor} to enforce serialization to + * a byte array prior continuing the request. Eager serialization leads to a known + * request body size that is required to send a + * {@link org.springframework.http.HttpHeaders#CONTENT_LENGTH} request header. + * Otherwise, Vault will deny body processing. + *

+ * Requires Jackson 2 for Object-to-JSON mapping. + * + * @return the {@link RestTemplate}. + * @see org.springframework.http.client.Netty4ClientHttpRequestFactory + * @see MappingJackson2HttpMessageConverter + */ + public static RestTemplate createRestTemplate() { + + List> messageConverters = new ArrayList>( + 3); + messageConverters.add(new ByteArrayHttpMessageConverter()); + messageConverters.add(new StringHttpMessageConverter()); + messageConverters.add(new MappingJackson2HttpMessageConverter()); + + RestTemplate restTemplate = new RestTemplate(messageConverters); + restTemplate.getInterceptors().add(new ClientHttpRequestInterceptor() { @Override diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppIdAuthenticationUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppIdAuthenticationUnitTests.java index 4157914c..a602a471 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppIdAuthenticationUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppIdAuthenticationUnitTests.java @@ -22,6 +22,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.vault.VaultException; +import org.springframework.vault.client.VaultClients; import org.springframework.vault.client.VaultClients.PrefixAwareUriTemplateHandler; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.RestTemplate; @@ -46,7 +47,7 @@ public class AppIdAuthenticationUnitTests { @Before public void before() throws Exception { - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate = VaultClients.createRestTemplate(); restTemplate.setUriTemplateHandler(new PrefixAwareUriTemplateHandler()); this.mockRest = MockRestServiceServer.createServer(restTemplate); this.restTemplate = restTemplate; diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppRoleAuthenticationUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppRoleAuthenticationUnitTests.java index f9230cc1..2e8a3d5b 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppRoleAuthenticationUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AppRoleAuthenticationUnitTests.java @@ -22,6 +22,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.vault.VaultException; +import org.springframework.vault.client.VaultClients; import org.springframework.vault.client.VaultClients.PrefixAwareUriTemplateHandler; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.RestTemplate; @@ -46,7 +47,7 @@ public class AppRoleAuthenticationUnitTests { @Before public void before() throws Exception { - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate = VaultClients.createRestTemplate(); restTemplate.setUriTemplateHandler(new PrefixAwareUriTemplateHandler()); this.mockRest = MockRestServiceServer.createServer(restTemplate); diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AwsEc2AuthenticationUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AwsEc2AuthenticationUnitTests.java index 4fca3530..8e619348 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/AwsEc2AuthenticationUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/AwsEc2AuthenticationUnitTests.java @@ -25,6 +25,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.vault.VaultException; +import org.springframework.vault.client.VaultClients; import org.springframework.vault.client.VaultClients.PrefixAwareUriTemplateHandler; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.RestTemplate; @@ -49,7 +50,7 @@ public class AwsEc2AuthenticationUnitTests { @Before public void before() throws Exception { - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate = VaultClients.createRestTemplate(); restTemplate.setUriTemplateHandler(new PrefixAwareUriTemplateHandler()); this.mockRest = MockRestServiceServer.createServer(restTemplate); diff --git a/spring-vault-core/src/test/java/org/springframework/vault/authentication/ClientCertificateAuthenticationUnitTests.java b/spring-vault-core/src/test/java/org/springframework/vault/authentication/ClientCertificateAuthenticationUnitTests.java index 3a38100a..bd13d6be 100644 --- a/spring-vault-core/src/test/java/org/springframework/vault/authentication/ClientCertificateAuthenticationUnitTests.java +++ b/spring-vault-core/src/test/java/org/springframework/vault/authentication/ClientCertificateAuthenticationUnitTests.java @@ -22,6 +22,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.test.web.client.MockRestServiceServer; import org.springframework.vault.VaultException; +import org.springframework.vault.client.VaultClients; import org.springframework.vault.client.VaultClients.PrefixAwareUriTemplateHandler; import org.springframework.vault.support.VaultToken; import org.springframework.web.client.RestTemplate; @@ -45,7 +46,7 @@ public class ClientCertificateAuthenticationUnitTests { @Before public void before() throws Exception { - RestTemplate restTemplate = new RestTemplate(); + RestTemplate restTemplate = VaultClients.createRestTemplate(); restTemplate.setUriTemplateHandler(new PrefixAwareUriTemplateHandler()); this.mockRest = MockRestServiceServer.createServer(restTemplate);