From b6da63aeb761d1a4e2259424745aefb27678ac33 Mon Sep 17 00:00:00 2001 From: Rossen Stoyanchev Date: Thu, 19 Apr 2018 13:50:50 -0400 Subject: [PATCH] Align with 5.0.x change #cd3ed7 --- .../server/DefaultRenderingResponseBuilder.java | 7 ++++--- .../AbstractMessageReaderArgumentResolver.java | 16 +++++++--------- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java index 498443e14d2..55d57685275 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/server/DefaultRenderingResponseBuilder.java @@ -184,7 +184,7 @@ class DefaultRenderingResponseBuilder implements RenderingResponse.Builder { @Override protected Mono writeToInternal(ServerWebExchange exchange, Context context) { - MediaType responseContentType = exchange.getResponse().getHeaders().getContentType(); + MediaType contentType = exchange.getResponse().getHeaders().getContentType(); Locale locale = LocaleContextHolder.getLocale(exchange.getLocaleContext()); Stream viewResolverStream = context.viewResolvers().stream(); @@ -195,8 +195,9 @@ class DefaultRenderingResponseBuilder implements RenderingResponse.Builder { new IllegalArgumentException("Could not resolve view with name '" + name() + "'"))) .flatMap(view -> { List 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); }); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java index b32c613c9bc..8a9ce14dc6e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/annotation/AbstractMessageReaderArgumentResolver.java @@ -144,6 +144,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 +152,14 @@ public abstract class AbstractMessageReaderArgumentResolver extends HandlerMetho MediaType contentType = request.getHeaders().getContentType(); MediaType mediaType = (contentType != null ? contentType : MediaType.APPLICATION_OCTET_STREAM); - Supplier missingBodyError = isBodyRequired || (adapter != null && !adapter.supportsEmpty()) ? - () -> handleMissingBody(bodyParam) : null; - for (HttpMessageReader reader : getMessageReaders()) { if (reader.canRead(elementType, mediaType)) { Map 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.error(() -> handleMissingBody(bodyParam))); } Object[] hints = extractValidationHints(bodyParam); if (hints != null) { @@ -174,8 +172,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.error(() -> handleMissingBody(bodyParam))); } Object[] hints = extractValidationHints(bodyParam); if (hints != null) { @@ -195,8 +193,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.error(() -> handleMissingBody(bodyParam))); } return (adapter != null ? Mono.just(adapter.fromPublisher(body)) : Mono.from(body)); }