Allow to pass hints parameter in HttpMessageReader/Writer
Issue: SPR-14557
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.springframework.web.reactive.function;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.function.Supplier;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@@ -46,10 +47,10 @@ abstract class AbstractHttpMessageWriterResponse<T> extends AbstractResponse<T>
|
||||
MediaType contentType = exchange.getResponse().getHeaders().getContentType();
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
return messageWriterStream(exchange)
|
||||
.filter(messageWriter -> messageWriter.canWrite(bodyType, contentType))
|
||||
.filter(messageWriter -> messageWriter.canWrite(bodyType, contentType, Collections.emptyMap()))
|
||||
.findFirst()
|
||||
.map(CastingUtils::cast)
|
||||
.map(messageWriter -> messageWriter.write(body, bodyType, contentType, response))
|
||||
.map(messageWriter -> messageWriter.write(body, bodyType, contentType, response, Collections.emptyMap()))
|
||||
.orElseGet(() -> {
|
||||
response.setStatusCode(HttpStatus.NOT_ACCEPTABLE);
|
||||
return response.setComplete();
|
||||
|
||||
@@ -173,13 +173,13 @@ class DefaultRequest implements Request {
|
||||
@Override
|
||||
public <T> Flux<T> convertTo(Class<? extends T> aClass) {
|
||||
ResolvableType elementType = ResolvableType.forClass(aClass);
|
||||
return convertTo(aClass, reader -> reader.read(elementType, request()));
|
||||
return convertTo(aClass, reader -> reader.read(elementType, request(), Collections.emptyMap()));
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> Mono<T> convertToMono(Class<? extends T> aClass) {
|
||||
ResolvableType elementType = ResolvableType.forClass(aClass);
|
||||
return convertTo(aClass, reader -> reader.readMono(elementType, request()));
|
||||
return convertTo(aClass, reader -> reader.readMono(elementType, request(), Collections.emptyMap()));
|
||||
}
|
||||
|
||||
private <T, S extends Publisher<T>> S convertTo(Class<? extends T> targetClass,
|
||||
@@ -187,7 +187,7 @@ class DefaultRequest implements Request {
|
||||
ResolvableType elementType = ResolvableType.forClass(targetClass);
|
||||
MediaType contentType = headers.contentType().orElse(MediaType.APPLICATION_OCTET_STREAM);
|
||||
return messageReaderStream(exchange)
|
||||
.filter(r -> r.canRead(elementType, contentType))
|
||||
.filter(r -> r.canRead(elementType, contentType, Collections.emptyMap()))
|
||||
.findFirst()
|
||||
.map(CastingUtils::<T>cast)
|
||||
.map(readerFunction)
|
||||
|
||||
@@ -16,6 +16,8 @@
|
||||
|
||||
package org.springframework.web.reactive.function;
|
||||
|
||||
import java.util.Collections;
|
||||
|
||||
import reactor.core.publisher.Mono;
|
||||
|
||||
import org.springframework.core.ResolvableType;
|
||||
@@ -48,8 +50,8 @@ class ResourceResponse extends AbstractResponse<Resource> {
|
||||
@Override
|
||||
public Mono<Void> writeTo(ServerWebExchange exchange) {
|
||||
writeStatusAndHeaders(exchange);
|
||||
return this.messageWriter
|
||||
.write(Mono.just(this.resource), RESOURCE_TYPE, null, exchange.getResponse());
|
||||
return this.messageWriter.write(Mono.just(this.resource), RESOURCE_TYPE, null,
|
||||
exchange.getResponse(), Collections.emptyMap());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -74,7 +74,8 @@ class ServerSentEventResponse<T extends Publisher<?>> extends AbstractResponse<T
|
||||
@Override
|
||||
public Mono<Void> writeTo(ServerWebExchange exchange) {
|
||||
writeStatusAndHeaders(exchange);
|
||||
return this.messageWriter.write(this.eventsPublisher, this.eventType, null, exchange.getResponse());
|
||||
return this.messageWriter.write(this.eventsPublisher, this.eventType, null,
|
||||
exchange.getResponse(), Collections.emptyMap());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import java.net.URLDecoder;
|
||||
import java.time.Instant;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
@@ -333,7 +334,7 @@ public class ResourceWebHandler
|
||||
|
||||
setHeaders(exchange, resource, mediaType);
|
||||
return this.resourceHttpMessageWriter.write(Mono.just(resource),
|
||||
ResolvableType.forClass(Resource.class), mediaType, exchange.getResponse());
|
||||
ResolvableType.forClass(Resource.class), mediaType, exchange.getResponse(), Collections.emptyMap());
|
||||
}
|
||||
catch (IOException ex) {
|
||||
return Mono.error(ex);
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
package org.springframework.web.reactive.result.method.annotation;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@@ -129,9 +130,9 @@ public abstract class AbstractMessageReaderArgumentResolver {
|
||||
}
|
||||
|
||||
for (HttpMessageReader<?> reader : getMessageReaders()) {
|
||||
if (reader.canRead(elementType, mediaType)) {
|
||||
if (reader.canRead(elementType, mediaType, Collections.emptyMap())) {
|
||||
if (adapter != null && adapter.getDescriptor().isMultiValue()) {
|
||||
Flux<?> flux = reader.read(elementType, request)
|
||||
Flux<?> flux = reader.read(elementType, request, Collections.emptyMap())
|
||||
.onErrorResumeWith(ex -> Flux.error(getReadError(ex, bodyParameter)));
|
||||
if (checkRequired(adapter, isBodyRequired)) {
|
||||
flux = flux.switchIfEmpty(Flux.error(getRequiredBodyError(bodyParameter)));
|
||||
@@ -142,7 +143,7 @@ public abstract class AbstractMessageReaderArgumentResolver {
|
||||
return Mono.just(adapter.fromPublisher(flux));
|
||||
}
|
||||
else {
|
||||
Mono<?> mono = reader.readMono(elementType, request)
|
||||
Mono<?> mono = reader.readMono(elementType, request, Collections.emptyMap())
|
||||
.otherwise(ex -> Mono.error(getReadError(ex, bodyParameter)));
|
||||
if (checkRequired(adapter, isBodyRequired)) {
|
||||
mono = mono.otherwiseIfEmpty(Mono.error(getRequiredBodyError(bodyParameter)));
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
*/
|
||||
package org.springframework.web.reactive.result.method.annotation;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -120,9 +121,10 @@ public abstract class AbstractMessageWriterResultHandler extends ContentNegotiat
|
||||
|
||||
if (bestMediaType != null) {
|
||||
for (HttpMessageWriter<?> messageWriter : getMessageWriters()) {
|
||||
if (messageWriter.canWrite(elementType, bestMediaType)) {
|
||||
if (messageWriter.canWrite(elementType, bestMediaType, Collections.emptyMap())) {
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
return messageWriter.write((Publisher) publisher, elementType, bestMediaType, response);
|
||||
return messageWriter.write((Publisher) publisher, elementType,
|
||||
bestMediaType, response, Collections.emptyMap());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -132,7 +134,7 @@ public abstract class AbstractMessageWriterResultHandler extends ContentNegotiat
|
||||
|
||||
private List<MediaType> getProducibleMediaTypes(ResolvableType elementType) {
|
||||
return getMessageWriters().stream()
|
||||
.filter(converter -> converter.canWrite(elementType, null))
|
||||
.filter(converter -> converter.canWrite(elementType, null, Collections.emptyMap()))
|
||||
.flatMap(converter -> converter.getWritableMediaTypes().stream())
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@@ -250,7 +250,7 @@ public class WebReactiveConfigurationTests {
|
||||
private void assertHasMessageReader(List<HttpMessageReader<?>> readers, Class<?> clazz, MediaType mediaType) {
|
||||
ResolvableType type = ResolvableType.forClass(clazz);
|
||||
assertTrue(readers.stream()
|
||||
.filter(c -> mediaType == null || c.canRead(type, mediaType))
|
||||
.filter(c -> mediaType == null || c.canRead(type, mediaType, Collections.emptyMap()))
|
||||
.findAny()
|
||||
.isPresent());
|
||||
}
|
||||
@@ -258,7 +258,7 @@ public class WebReactiveConfigurationTests {
|
||||
private void assertHasMessageWriter(List<HttpMessageWriter<?>> writers, Class<?> clazz, MediaType mediaType) {
|
||||
ResolvableType type = ResolvableType.forClass(clazz);
|
||||
assertTrue(writers.stream()
|
||||
.filter(c -> mediaType == null || c.canWrite(type, mediaType))
|
||||
.filter(c -> mediaType == null || c.canWrite(type, mediaType, Collections.emptyMap()))
|
||||
.findAny()
|
||||
.isPresent());
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ package org.springframework.web.reactive.function;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.junit.Test;
|
||||
@@ -163,7 +164,7 @@ public class RouterTests {
|
||||
private static class DummyMessageWriter implements HttpMessageWriter<Object> {
|
||||
|
||||
@Override
|
||||
public boolean canWrite(ResolvableType type, MediaType mediaType) {
|
||||
public boolean canWrite(ResolvableType type, MediaType mediaType, Map<String, Object> hints) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -175,7 +176,8 @@ public class RouterTests {
|
||||
@Override
|
||||
public Mono<Void> write(Publisher<?> inputStream, ResolvableType type,
|
||||
MediaType contentType,
|
||||
ReactiveHttpOutputMessage outputMessage) {
|
||||
ReactiveHttpOutputMessage outputMessage,
|
||||
Map<String, Object> hints) {
|
||||
return Mono.empty();
|
||||
}
|
||||
}
|
||||
@@ -183,7 +185,7 @@ public class RouterTests {
|
||||
private static class DummyMessageReader implements HttpMessageReader<Object> {
|
||||
|
||||
@Override
|
||||
public boolean canRead(ResolvableType type, MediaType mediaType) {
|
||||
public boolean canRead(ResolvableType type, MediaType mediaType, Map<String, Object> hints) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -193,12 +195,14 @@ public class RouterTests {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Flux<Object> read(ResolvableType type, ReactiveHttpInputMessage inputMessage) {
|
||||
public Flux<Object> read(ResolvableType type, ReactiveHttpInputMessage inputMessage,
|
||||
Map<String, Object> hints) {
|
||||
return Flux.empty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Mono<Object> readMono(ResolvableType type, ReactiveHttpInputMessage inputMessage) {
|
||||
public Mono<Object> readMono(ResolvableType type, ReactiveHttpInputMessage inputMessage,
|
||||
Map<String, Object> hints) {
|
||||
return Mono.empty();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user