In 5.0.x we don't have Flux/Mono error with Supplier

Issue: SPR-16726
This commit is contained in:
Rossen Stoyanchev
2018-04-19 13:41:01 -04:00
parent 66bd277671
commit d3ed7b624d
2 changed files with 15 additions and 15 deletions

View File

@@ -184,19 +184,22 @@ class DefaultRenderingResponseBuilder implements RenderingResponse.Builder {
@Override
protected Mono<Void> writeToInternal(ServerWebExchange exchange, Context context) {
MediaType responseContentType = exchange.getResponse().getHeaders().getContentType();
MediaType contentType = exchange.getResponse().getHeaders().getContentType();
Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext());
Stream<ViewResolver> viewResolverStream = context.viewResolvers().stream();
return Flux.fromStream(viewResolverStream)
.concatMap(viewResolver -> viewResolver.resolveViewName(name(), locale))
.next()
.switchIfEmpty(Mono.error(() ->
new IllegalArgumentException("Could not resolve view with name '" + name() + "'")))
.switchIfEmpty(Mono.defer(() -> {
String error = "Could not resolve view with name '" + name() + "'";
return Mono.error(new IllegalArgumentException(error));
}))
.flatMap(view -> {
List<MediaType> mediaTypes = view.getSupportedMediaTypes();
MediaType contentType = (responseContentType == null && !mediaTypes.isEmpty() ? mediaTypes.get(0) : responseContentType);
return view.render(model(), contentType, exchange);
return view.render(model(),
contentType == null && !mediaTypes.isEmpty() ? mediaTypes.get(0) : contentType,
exchange);
});
}

View File

@@ -22,7 +22,6 @@ import java.util.EnumSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import reactor.core.publisher.Flux;
@@ -144,6 +143,7 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
Class<?> resolvedType = bodyType.resolve();
ReactiveAdapter adapter = (resolvedType != null ? getAdapterRegistry().getAdapter(resolvedType) : null);
ResolvableType elementType = (adapter != null ? bodyType.getGeneric() : bodyType);
isBodyRequired = isBodyRequired || (adapter != null && !adapter.supportsEmpty());
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
@@ -151,17 +151,14 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
MediaType contentType = request.getHeaders().getContentType();
MediaType mediaType = (contentType != null ? contentType : MediaType.APPLICATION_OCTET_STREAM);
Supplier<Throwable> missingBodyError = isBodyRequired || (adapter != null && !adapter.supportsEmpty()) ?
() -> handleMissingBody(bodyParam) : null;
for (HttpMessageReader<?> reader : getMessageReaders()) {
if (reader.canRead(elementType, mediaType)) {
Map<String, Object> readHints = Collections.emptyMap();
if (adapter != null && adapter.isMultiValue()) {
Flux<?> flux = reader.read(actualType, elementType, request, response, readHints);
flux = flux.onErrorResume(ex -> Flux.error(handleReadError(bodyParam, ex)));
if (missingBodyError != null) {
flux = flux.switchIfEmpty(Flux.error(missingBodyError));
if (isBodyRequired) {
flux = flux.switchIfEmpty(Flux.defer(() -> Flux.error(handleMissingBody(bodyParam))));
}
Object[] hints = extractValidationHints(bodyParam);
if (hints != null) {
@@ -174,8 +171,8 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
// Single-value (with or without reactive type wrapper)
Mono<?> mono = reader.readMono(actualType, elementType, request, response, readHints);
mono = mono.onErrorResume(ex -> Mono.error(handleReadError(bodyParam, ex)));
if (missingBodyError != null) {
mono = mono.switchIfEmpty(Mono.error(missingBodyError));
if (isBodyRequired) {
mono = mono.switchIfEmpty(Mono.defer(() -> Mono.error(handleMissingBody(bodyParam))));
}
Object[] hints = extractValidationHints(bodyParam);
if (hints != null) {
@@ -195,8 +192,8 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho
// Body not empty, back to 415..
throw new UnsupportedMediaTypeStatusException(mediaType, this.supportedMediaTypes);
});
if (missingBodyError != null) {
body = body.switchIfEmpty(Mono.error(missingBodyError));
if (isBodyRequired) {
body = body.switchIfEmpty(Mono.defer(() -> Mono.error(handleMissingBody(bodyParam))));
}
return (adapter != null ? Mono.just(adapter.fromPublisher(body)) : Mono.from(body));
}