Update use of preset content-type for streaming

For 7.0 we can favor more explicitly a preset Content-type.

Closes gh-35130
This commit is contained in:
rstoyanchev 2025-06-30 15:40:33 +01:00
parent 817136a0e9
commit 1a9f19f87f
1 changed files with 4 additions and 15 deletions

View File

@ -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<MediaType> mediaTypes = getMediaTypes(request, presetContentType);
Collection<MediaType> mediaTypes = (presetMediaType != null ? List.of(presetMediaType) : getMediaTypes(request));
Optional<MediaType> mediaType = mediaTypes.stream().filter(MimeType::isConcrete).findFirst();
if (adapter.isMultiValue()) {
@ -221,25 +221,14 @@ class ReactiveTypeHandler {
}
@SuppressWarnings("unchecked")
private Collection<MediaType> getMediaTypes(NativeWebRequest request, @Nullable MediaType contentType)
private Collection<MediaType> getMediaTypes(NativeWebRequest request)
throws HttpMediaTypeNotAcceptableException {
Collection<MediaType> producibleMediaTypes = (Collection<MediaType>) request.getAttribute(
HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
Collection<MediaType> 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) {