提交 91a75ed7 编写于 作者: R Rossen Stoyanchev

Polish EncoderHttpMessageWriter Content-Type handling

上级 ad91b942
...@@ -49,6 +49,8 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> { ...@@ -49,6 +49,8 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
private final List<MediaType> mediaTypes; private final List<MediaType> mediaTypes;
private final MediaType defaultMediaType;
/** /**
* Create an instance wrapping the given {@link Encoder}. * Create an instance wrapping the given {@link Encoder}.
...@@ -57,6 +59,11 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> { ...@@ -57,6 +59,11 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
Assert.notNull(encoder, "Encoder is required"); Assert.notNull(encoder, "Encoder is required");
this.encoder = encoder; this.encoder = encoder;
this.mediaTypes = MediaType.asMediaTypes(encoder.getEncodableMimeTypes()); this.mediaTypes = MediaType.asMediaTypes(encoder.getEncodableMimeTypes());
this.defaultMediaType = initDefaultMediaType(this.mediaTypes);
}
private static MediaType initDefaultMediaType(List<MediaType> mediaTypes) {
return mediaTypes.stream().filter(MediaType::isConcrete).findFirst().orElse(null);
} }
...@@ -84,23 +91,13 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> { ...@@ -84,23 +91,13 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
Map<String, Object> hints) { Map<String, Object> hints) {
HttpHeaders headers = outputMessage.getHeaders(); HttpHeaders headers = outputMessage.getHeaders();
if (headers.getContentType() == null) { if (headers.getContentType() == null) {
MediaType contentTypeToUse = mediaType; MediaType fallback = this.defaultMediaType;
if (mediaType == null || mediaType.isWildcardType() || mediaType.isWildcardSubtype()) { MediaType selected = useFallback(mediaType, fallback) ? fallback : mediaType;
contentTypeToUse = getDefaultContentType(elementType); if (selected != null) {
} selected = addDefaultCharset(selected, fallback);
else if (MediaType.APPLICATION_OCTET_STREAM.equals(mediaType)) { headers.setContentType(selected);
MediaType contentType = getDefaultContentType(elementType);
contentTypeToUse = (contentType != null ? contentType : contentTypeToUse);
}
if (contentTypeToUse != null) {
if (contentTypeToUse.getCharset() == null) {
MediaType contentType = getDefaultContentType(elementType);
if (contentType != null && contentType.getCharset() != null) {
contentTypeToUse = new MediaType(contentTypeToUse, contentType.getCharset());
}
}
headers.setContentType(contentTypeToUse);
} }
} }
...@@ -110,18 +107,17 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> { ...@@ -110,18 +107,17 @@ public class EncoderHttpMessageWriter<T> implements HttpMessageWriter<T> {
outputMessage.writeAndFlushWith(body.map(Flux::just)) : outputMessage.writeWith(body)); outputMessage.writeAndFlushWith(body.map(Flux::just)) : outputMessage.writeWith(body));
} }
/**
* Return the default content type for the given {@code ResolvableType}. private static boolean useFallback(MediaType main, MediaType fallback) {
* Used when {@link #write} is called without a concrete content type. return main == null || !main.isConcrete() ||
* main.equals(MediaType.APPLICATION_OCTET_STREAM) && fallback != null;
* <p>By default returns the first of {@link Encoder#getEncodableMimeTypes() }
* encodableMimeTypes} that is concrete({@link MediaType#isConcrete()}), if any.
* private static MediaType addDefaultCharset(MediaType main, MediaType defaultType) {
* @param elementType the type of element for encoding if (main.getCharset() == null && defaultType != null && defaultType.getCharset() != null) {
* @return the content type, or {@code null} return new MediaType(main, defaultType.getCharset());
*/ }
protected MediaType getDefaultContentType(ResolvableType elementType) { return main;
return this.mediaTypes.stream().filter(MediaType::isConcrete).findFirst().orElse(null);
} }
} }
...@@ -66,12 +66,6 @@ public class ResourceRegionHttpMessageWriterTests { ...@@ -66,12 +66,6 @@ public class ResourceRegionHttpMessageWriterTests {
} }
@Test
public void defaultContentType() throws Exception {
assertEquals(MimeTypeUtils.APPLICATION_OCTET_STREAM,
this.writer.getDefaultContentType(ResolvableType.forClass(ResourceRegion.class)));
}
@Test @Test
public void writableMediaTypes() throws Exception { public void writableMediaTypes() throws Exception {
assertThat(this.writer.getWritableMediaTypes(), assertThat(this.writer.getWritableMediaTypes(),
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册