MIME types by Class for Encoder, Decoder, HttpMessageReader|Writer
Closes gh-26212
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2019 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -196,7 +196,7 @@ public abstract class BodyExtractors {
|
||||
.map(readerFunction)
|
||||
.orElseGet(() -> {
|
||||
List<MediaType> mediaTypes = context.messageReaders().stream()
|
||||
.flatMap(reader -> reader.getReadableMediaTypes().stream())
|
||||
.flatMap(reader -> reader.getReadableMediaTypes(elementType).stream())
|
||||
.collect(Collectors.toList());
|
||||
return errorFunction.apply(
|
||||
new UnsupportedMediaTypeException(contentType, mediaTypes, elementType));
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -385,7 +385,7 @@ public abstract class BodyInserters {
|
||||
BodyInserter.Context context, @Nullable MediaType mediaType) {
|
||||
|
||||
List<MediaType> supportedMediaTypes = context.messageWriters().stream()
|
||||
.flatMap(reader -> reader.getWritableMediaTypes().stream())
|
||||
.flatMap(reader -> reader.getWritableMediaTypes(bodyType).stream())
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return new UnsupportedMediaTypeException(mediaType, supportedMediaTypes, bodyType);
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
package org.springframework.web.reactive.result.method.annotation;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.ArrayList;
|
||||
import java.util.EnumSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import reactor.core.publisher.Flux;
|
||||
import reactor.core.publisher.Mono;
|
||||
@@ -76,8 +76,6 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
|
||||
|
||||
private final List<HttpMessageReader<?>> messageReaders;
|
||||
|
||||
private final List<MediaType> supportedMediaTypes;
|
||||
|
||||
|
||||
/**
|
||||
* Constructor with {@link HttpMessageReader}'s and a {@link Validator}.
|
||||
@@ -99,9 +97,6 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
|
||||
Assert.notEmpty(messageReaders, "At least one HttpMessageReader is required");
|
||||
Assert.notNull(adapterRegistry, "ReactiveAdapterRegistry is required");
|
||||
this.messageReaders = messageReaders;
|
||||
this.supportedMediaTypes = messageReaders.stream()
|
||||
.flatMap(converter -> converter.getReadableMediaTypes().stream())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
|
||||
@@ -212,8 +207,9 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
|
||||
if (contentType == null && method != null && SUPPORTED_METHODS.contains(method)) {
|
||||
Flux<DataBuffer> body = request.getBody().doOnNext(buffer -> {
|
||||
DataBufferUtils.release(buffer);
|
||||
// Body not empty, back to 415..
|
||||
throw new UnsupportedMediaTypeStatusException(mediaType, this.supportedMediaTypes, elementType);
|
||||
// Body not empty, back toy 415..
|
||||
throw new UnsupportedMediaTypeStatusException(
|
||||
mediaType, getSupportedMediaTypes(elementType), elementType);
|
||||
});
|
||||
if (isBodyRequired) {
|
||||
body = body.switchIfEmpty(Mono.error(() -> handleMissingBody(bodyParam)));
|
||||
@@ -221,7 +217,8 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
|
||||
return (adapter != null ? Mono.just(adapter.fromPublisher(body)) : Mono.from(body));
|
||||
}
|
||||
|
||||
return Mono.error(new UnsupportedMediaTypeStatusException(mediaType, this.supportedMediaTypes, elementType));
|
||||
return Mono.error(new UnsupportedMediaTypeStatusException(
|
||||
mediaType, getSupportedMediaTypes(elementType), elementType));
|
||||
}
|
||||
|
||||
private Throwable handleReadError(MethodParameter parameter, Throwable ex) {
|
||||
@@ -263,4 +260,12 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
|
||||
}
|
||||
}
|
||||
|
||||
private List<MediaType> getSupportedMediaTypes(ResolvableType elementType) {
|
||||
List<MediaType> mediaTypes = new ArrayList<>();
|
||||
for (HttpMessageReader<?> reader : this.messageReaders) {
|
||||
mediaTypes.addAll(reader.getReadableMediaTypes(elementType));
|
||||
}
|
||||
return mediaTypes;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2002-2020 the original author or authors.
|
||||
* Copyright 2002-2021 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -192,7 +192,7 @@ public abstract class AbstractMessageWriterResultHandler extends HandlerResultHa
|
||||
List<MediaType> writableMediaTypes = new ArrayList<>();
|
||||
for (HttpMessageWriter<?> converter : getMessageWriters()) {
|
||||
if (converter.canWrite(elementType, null)) {
|
||||
writableMediaTypes.addAll(converter.getWritableMediaTypes());
|
||||
writableMediaTypes.addAll(converter.getWritableMediaTypes(elementType));
|
||||
}
|
||||
}
|
||||
return writableMediaTypes;
|
||||
|
||||
Reference in New Issue
Block a user