diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java index 8b12145f5fb..5f36840ffbe 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java @@ -116,6 +116,11 @@ public abstract class HandlerResultHandlerSupport implements Ordered { protected MediaType selectMediaType(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { + MediaType contentType = exchange.getResponse().getHeaders().getContentType(); + if (contentType != null && contentType.isConcrete()) { + return contentType; + } + List acceptableTypes = getAcceptableTypes(exchange); List producibleTypes = getProducibleTypes(exchange, producibleTypesSupplier); @@ -152,10 +157,6 @@ public abstract class HandlerResultHandlerSupport implements Ordered { private List getProducibleTypes(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { - MediaType contentType = exchange.getResponse().getHeaders().getContentType(); - if (contentType != null && contentType.isConcrete()) { - return Collections.singletonList(contentType); - } Set mediaTypes = exchange.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE); return (mediaTypes != null ? new ArrayList<>(mediaTypes) : producibleTypesSupplier.get()); } diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java index 9cc950017f9..36adce100e6 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/AbstractMessageConverterMethodProcessor.java @@ -22,7 +22,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Set; @@ -210,37 +209,41 @@ public abstract class AbstractMessageConverterMethodProcessor extends AbstractMe } } - HttpServletRequest request = inputMessage.getServletRequest(); - List requestedMediaTypes = getAcceptableMediaTypes(request); - MediaType contentType = outputMessage.getHeaders().getContentType(); - List producibleMediaTypes = (contentType != null && contentType.isConcrete() ? - Collections.singletonList(contentType) : getProducibleMediaTypes(request, valueType, declaredType)); + List mediaTypesToUse; - if (outputValue != null && producibleMediaTypes.isEmpty()) { - throw new HttpMessageNotWritableException("No converter found for return value of type: " + valueType); + MediaType contentType = outputMessage.getHeaders().getContentType(); + if (contentType != null && contentType.isConcrete()) { + mediaTypesToUse = Collections.singletonList(contentType); } + else { + HttpServletRequest request = inputMessage.getServletRequest(); + List requestedMediaTypes = getAcceptableMediaTypes(request); + List producibleMediaTypes = getProducibleMediaTypes(request, valueType, declaredType); - Set compatibleMediaTypes = new LinkedHashSet<>(); - for (MediaType requestedType : requestedMediaTypes) { - for (MediaType producibleType : producibleMediaTypes) { - if (requestedType.isCompatibleWith(producibleType)) { - compatibleMediaTypes.add(getMostSpecificMediaType(requestedType, producibleType)); + if (outputValue != null && producibleMediaTypes.isEmpty()) { + throw new HttpMessageNotWritableException( + "No converter found for return value of type: " + valueType); + } + mediaTypesToUse = new ArrayList<>(); + for (MediaType requestedType : requestedMediaTypes) { + for (MediaType producibleType : producibleMediaTypes) { + if (requestedType.isCompatibleWith(producibleType)) { + mediaTypesToUse.add(getMostSpecificMediaType(requestedType, producibleType)); + } } } - } - if (compatibleMediaTypes.isEmpty()) { - if (outputValue != null) { - throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes); + if (mediaTypesToUse.isEmpty()) { + if (outputValue != null) { + throw new HttpMediaTypeNotAcceptableException(producibleMediaTypes); + } + return; } - return; + MediaType.sortBySpecificityAndQuality(mediaTypesToUse); } - List mediaTypes = new ArrayList<>(compatibleMediaTypes); - MediaType.sortBySpecificityAndQuality(mediaTypes); - MediaType selectedMediaType = null; - for (MediaType mediaType : mediaTypes) { + for (MediaType mediaType : mediaTypesToUse) { if (mediaType.isConcrete()) { selectedMediaType = mediaType; break;