Introduce addSupportedMediaType() in FormHttpMessageConverter

Closes gh-23203
This commit is contained in:
Sam Brannen 2019-06-27 16:00:02 +03:00
parent 8e1cb9a059
commit 4e7d8a8873
2 changed files with 51 additions and 14 deletions

View File

@ -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<MultiValue
/**
* Set the list of {@link MediaType} objects supported by this converter.
* @see #addSupportedMediaType(MediaType)
* @see #getSupportedMediaTypes()
*/
public void setSupportedMediaTypes(List<MediaType> 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

View File

@ -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<MediaType> 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