From 4e7d8a8873969755d3bce92c6f3c00d79b082aed Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Thu, 27 Jun 2019 16:00:02 +0300 Subject: [PATCH] Introduce addSupportedMediaType() in FormHttpMessageConverter Closes gh-23203 --- .../converter/FormHttpMessageConverter.java | 17 ++++++- .../FormHttpMessageConverterTests.java | 48 ++++++++++++++----- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java index e39b6e13ce..4b62f09577 100644 --- a/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java +++ b/spring-web/src/main/java/org/springframework/http/converter/FormHttpMessageConverter.java @@ -88,6 +88,7 @@ import org.springframework.util.StringUtils; * @author Arjen Poutsma * @author Rossen Stoyanchev * @author Juergen Hoeller + * @author Sam Brannen * @since 3.0 * @see org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter * @see org.springframework.util.MultiValueMap @@ -127,9 +128,23 @@ public class FormHttpMessageConverter implements HttpMessageConverter supportedMediaTypes) { - this.supportedMediaTypes = supportedMediaTypes; + Assert.notNull(supportedMediaTypes, "'supportedMediaTypes' must not be null"); + // Ensure internal list is mutable. + this.supportedMediaTypes = new ArrayList<>(supportedMediaTypes); + } + + /** + * Add a {@link MediaType} to be supported by this converter. + * @since 5.2 + * @see #setSupportedMediaTypes(List) + */ + public void addSupportedMediaType(MediaType supportedMediaType) { + Assert.notNull(supportedMediaType, "'supportedMediaType' must not be null"); + this.supportedMediaTypes.add(supportedMediaType); } @Override diff --git a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java index b56bdfd387..a1b6fec9f0 100644 --- a/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java +++ b/spring-web/src/test/java/org/springframework/http/converter/FormHttpMessageConverterTests.java @@ -58,36 +58,58 @@ import static org.mockito.Mockito.verify; */ public class FormHttpMessageConverterTests { + protected static final MediaType MULTIPART_MIXED = new MediaType("multipart", "mixed"); + protected static final MediaType MULTIPART_RELATED = new MediaType("multipart", "related"); + private final FormHttpMessageConverter converter = new AllEncompassingFormHttpMessageConverter(); @Test public void canRead() { - assertThat(this.converter.canRead(MultiValueMap.class, new MediaType("application", "x-www-form-urlencoded"))).isTrue(); - assertThat(this.converter.canRead(MultiValueMap.class, new MediaType("multipart", "form-data"))).isFalse(); + assertThat(this.converter.canRead(MultiValueMap.class, MediaType.APPLICATION_FORM_URLENCODED)).isTrue(); + assertThat(this.converter.canRead(MultiValueMap.class, MediaType.MULTIPART_FORM_DATA)).isFalse(); } @Test public void canWrite() { - assertCanWrite(MultiValueMap.class, new MediaType("application", "x-www-form-urlencoded")); - assertCanWrite(MultiValueMap.class, new MediaType("multipart", "form-data")); - assertCanWrite(MultiValueMap.class, new MediaType("multipart", "form-data", StandardCharsets.UTF_8)); - assertCanWrite(MultiValueMap.class, MediaType.ALL); + assertCanWrite(MediaType.APPLICATION_FORM_URLENCODED); + assertCanWrite(MediaType.MULTIPART_FORM_DATA); + assertCanWrite(new MediaType("multipart", "form-data", StandardCharsets.UTF_8)); + assertCanWrite(MediaType.ALL); } @Test - public void canWriteMultipartMixedAndMultipartRelated() { + public void setSupportedMediaTypes() { + assertCannotWrite(MULTIPART_MIXED); + assertCannotWrite(MULTIPART_RELATED); + List supportedMediaTypes = new ArrayList<>(this.converter.getSupportedMediaTypes()); - supportedMediaTypes.add(new MediaType("multipart", "mixed")); - supportedMediaTypes.add(new MediaType("multipart", "related")); + supportedMediaTypes.add(MULTIPART_MIXED); + supportedMediaTypes.add(MULTIPART_RELATED); this.converter.setSupportedMediaTypes(supportedMediaTypes); - assertCanWrite(MultiValueMap.class, new MediaType("multipart", "mixed")); - assertCanWrite(MultiValueMap.class, new MediaType("multipart", "related")); + assertCanWrite(MULTIPART_MIXED); + assertCanWrite(MULTIPART_RELATED); } - private void assertCanWrite(Class clazz, MediaType mediaType) { - assertThat(this.converter.canWrite(clazz, mediaType)).isTrue(); + @Test + public void addSupportedMediaType() { + assertCannotWrite(MULTIPART_MIXED); + assertCannotWrite(MULTIPART_RELATED); + + this.converter.addSupportedMediaType(MULTIPART_MIXED); + this.converter.addSupportedMediaType(MULTIPART_RELATED); + + assertCanWrite(MULTIPART_MIXED); + assertCanWrite(MULTIPART_RELATED); + } + + private void assertCanWrite(MediaType mediaType) { + assertThat(this.converter.canWrite(MultiValueMap.class, mediaType)).isTrue(); + } + + private void assertCannotWrite(MediaType mediaType) { + assertThat(this.converter.canWrite(MultiValueMap.class, mediaType)).isFalse(); } @Test