diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java index 8316ee0c6de..2e9178c787c 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpRequestValues.java @@ -389,14 +389,15 @@ public final class HttpRequestValues { Map uriVars = (this.uriVars != null ? new HashMap<>(this.uriVars) : Collections.emptyMap()); Object bodyValue = this.bodyValue; + if (this.multipartBuilder != null) { + Assert.isTrue(bodyValue == null && this.body == null, "Expected body or request parts, not both"); + bodyValue = this.multipartBuilder.build(); + } if (!CollectionUtils.isEmpty(this.requestParams)) { - - boolean isFormData = (this.headers != null && - MediaType.APPLICATION_FORM_URLENCODED.equals(this.headers.getContentType())); - - if (isFormData) { - Assert.isTrue(bodyValue == null && this.body == null, "Expected body or request params, not both"); + if (hasContentType(MediaType.APPLICATION_FORM_URLENCODED)) { + Assert.isTrue(this.multipartBuilder == null, "Cannot add parts to form data request"); + Assert.isTrue(bodyValue == null && this.body == null, "Cannot set body of form data request"); bodyValue = new LinkedMultiValueMap<>(this.requestParams); } else if (uri != null) { @@ -412,10 +413,6 @@ public final class HttpRequestValues { uriTemplate = appendQueryParams(uriTemplate, uriVars, this.requestParams); } } - else if (this.multipartBuilder != null) { - Assert.isTrue(bodyValue == null && this.body == null, "Expected body or request parts, not both"); - bodyValue = this.multipartBuilder.build(); - } HttpHeaders headers = HttpHeaders.EMPTY; if (this.headers != null) { @@ -434,6 +431,10 @@ public final class HttpRequestValues { bodyValue, this.body, this.bodyElementType); } + private boolean hasContentType(MediaType mediaType) { + return (this.headers != null && mediaType.equals(this.headers.getContentType())); + } + private String appendQueryParams( String uriTemplate, Map uriVars, MultiValueMap requestParams) { diff --git a/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java b/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java index 4fa0325647d..39aa9e6ac84 100644 --- a/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java +++ b/spring-web/src/test/java/org/springframework/web/service/invoker/HttpRequestValuesTests.java @@ -131,4 +131,24 @@ class HttpRequestValuesTests { assertThat(map.getFirst("entity")).isEqualTo(entity); } + @Test + void requestPartAndRequestParam() { + + HttpRequestValues requestValues = HttpRequestValues.builder() + .setUriTemplate("/path") + .addRequestPart("form field", "form value") + .addRequestParameter("query param", "query value") + .build(); + + String uriTemplate = requestValues.getUriTemplate(); + assertThat(uriTemplate).isNotNull(); + + assertThat(uriTemplate).isEqualTo("/path?{queryParam0}={queryParam0[0]}"); + + @SuppressWarnings("unchecked") + MultiValueMap> map = (MultiValueMap>) requestValues.getBodyValue(); + assertThat(map).hasSize(1); + assertThat(map.getFirst("form field").getBody()).isEqualTo("form value"); + } + }