From 1a9f19f87f27580b75b861d94d2df05c05e16eb1 Mon Sep 17 00:00:00 2001 From: rstoyanchev Date: Mon, 30 Jun 2025 15:40:33 +0100 Subject: [PATCH] Update use of preset content-type for streaming For 7.0 we can favor more explicitly a preset Content-type. Closes gh-35130 --- .../annotation/ReactiveTypeHandler.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java index aa0bc569751..3cf979feb71 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ReactiveTypeHandler.java @@ -136,7 +136,7 @@ class ReactiveTypeHandler { * with a {@link DeferredResult} */ public @Nullable ResponseBodyEmitter handleValue( - Object returnValue, MethodParameter returnType, @Nullable MediaType presetContentType, + Object returnValue, MethodParameter returnType, @Nullable MediaType presetMediaType, ModelAndViewContainer mav, NativeWebRequest request) throws Exception { Assert.notNull(returnValue, "Expected return value"); @@ -155,7 +155,7 @@ class ReactiveTypeHandler { ResolvableType elementType = ResolvableType.forMethodParameter(returnType).getGeneric(); Class elementClass = elementType.toClass(); - Collection mediaTypes = getMediaTypes(request, presetContentType); + Collection mediaTypes = (presetMediaType != null ? List.of(presetMediaType) : getMediaTypes(request)); Optional mediaType = mediaTypes.stream().filter(MimeType::isConcrete).findFirst(); if (adapter.isMultiValue()) { @@ -221,25 +221,14 @@ class ReactiveTypeHandler { } @SuppressWarnings("unchecked") - private Collection getMediaTypes(NativeWebRequest request, @Nullable MediaType contentType) + private Collection getMediaTypes(NativeWebRequest request) throws HttpMediaTypeNotAcceptableException { Collection producibleMediaTypes = (Collection) request.getAttribute( HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST); - Collection mediaTypes = (CollectionUtils.isEmpty(producibleMediaTypes) ? + return (CollectionUtils.isEmpty(producibleMediaTypes) ? this.contentNegotiationManager.resolveMediaTypes(request) : producibleMediaTypes); - - if (contentType != null) { - for (MediaType mediaType : mediaTypes) { - if (mediaType.isConcrete()) { - return mediaTypes; - } - } - return List.of(contentType); - } - - return mediaTypes; } private ResponseBodyEmitter getEmitter(MediaType mediaType) {