Prior to this commit, the `FormHttpMessageConverter` would only support
`MultiValueMap` payloads for reading and writing. While this can be
useful when web forms contain multiple values under the same key, this
prevent developers from using a common `Map` type and factory methods
like `Map.of(...)`.
This commit relaxes constraints in `FormHttpMessageConverter` and
ensures that `Map` types are supported for reading and writing URL
encoded forms.
Note that when reading forms to a `Map`, only the first value for each
key will be considered and other values will be dropped if they exist.
Closes gh-36408
@ -26,6 +26,7 @@ By default, this converter supports all text media types(`text/{asterisk}`) and
@@ -26,6 +26,7 @@ By default, this converter supports all text media types(`text/{asterisk}`) and
| An `HttpMessageConverter` implementation that can read and write URL encoded forms.
By default, this converter reads and writes the `application/x-www-form-urlencoded` media type.
Form data is read from and written into a `MultiValueMap<String, String>`.
`Map<String, String>` is also supported, but multiple values under the same key will be ignored.
| `MultipartHttpMessageConverter`
| An `HttpMessageConverter` implementation that can read and write multipart messages.
@ -1022,6 +1022,7 @@ public abstract class AbstractMockHttpServletRequestBuilder<B extends AbstractMo
@@ -1022,6 +1022,7 @@ public abstract class AbstractMockHttpServletRequestBuilder<B extends AbstractMo
@ -1038,7 +1039,7 @@ public abstract class AbstractMockHttpServletRequestBuilder<B extends AbstractMo
@@ -1038,7 +1039,7 @@ public abstract class AbstractMockHttpServletRequestBuilder<B extends AbstractMo
@ -106,28 +113,20 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@@ -106,28 +113,20 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@ -135,7 +134,7 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@@ -135,7 +134,7 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@ -161,20 +160,31 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@@ -161,20 +160,31 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
catch(IllegalArgumentExceptionex){
thrownewHttpMessageNotReadableException("Could not decode HTTP form payload",ex,inputMessage);
@ -204,6 +214,18 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@@ -204,6 +214,18 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@ -211,19 +233,20 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
@@ -211,19 +233,20 @@ public class FormHttpMessageConverter implements SmartHttpMessageConverter<Multi
Assert.isTrue(CollectionUtils.isEmpty(values),()->"Null name in form data: "+formData);
@ -94,6 +94,7 @@ public class FormContentFilter extends OncePerRequestFilter {
@@ -94,6 +94,7 @@ public class FormContentFilter extends OncePerRequestFilter {
@ -105,7 +106,7 @@ public class FormContentFilter extends OncePerRequestFilter {
@@ -105,7 +106,7 @@ public class FormContentFilter extends OncePerRequestFilter {