diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java index 8e8fb26fc28..a4652125c34 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/HandlerResultHandlerSupport.java @@ -21,7 +21,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.LinkedHashSet; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.function.Supplier; @@ -150,12 +149,9 @@ public abstract class HandlerResultHandlerSupport implements Ordered { private List getProducibleTypes(ServerWebExchange exchange, Supplier> producibleTypesSupplier) { - Optional optional = exchange.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE); - if (optional.isPresent()) { - Set set = (Set) optional.get(); - return new ArrayList<>(set); - } - return producibleTypesSupplier.get(); + return exchange.getAttribute(HandlerMapping.PRODUCIBLE_MEDIA_TYPES_ATTRIBUTE) + .map(attribute -> (List) new ArrayList<>((Set) attribute)) + .orElseGet(producibleTypesSupplier); } private MediaType selectMoreSpecificMediaType(MediaType acceptable, MediaType producible) { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java index d06ae82158e..7d3190735f9 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/HttpMessageWriterView.java @@ -20,7 +20,6 @@ import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; @@ -32,7 +31,6 @@ import org.springframework.core.codec.Encoder; import org.springframework.http.MediaType; import org.springframework.http.codec.EncoderHttpMessageWriter; import org.springframework.http.codec.HttpMessageWriter; -import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.util.Assert; import org.springframework.web.server.ServerWebExchange; @@ -116,25 +114,26 @@ public class HttpMessageWriterView implements View { @Override @SuppressWarnings("unchecked") public Mono render(Map model, MediaType contentType, ServerWebExchange exchange) { - return getObjectToRender(model) - .map(value -> write(value, contentType, exchange)) - .orElseGet(() -> exchange.getResponse().setComplete()); + Object value = getObjectToRender(model); + return (value != null) ? + write(value, contentType, exchange) : + exchange.getResponse().setComplete(); } - private Optional getObjectToRender(Map model) { + private Object getObjectToRender(Map model) { Map result = model.entrySet().stream() .filter(this::isMatch) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); if (result.isEmpty()) { - return Optional.empty(); + return null; } else if (result.size() == 1) { - return Optional.of(result.values().iterator().next()); + return result.values().iterator().next(); } else if (this.canWriteMap) { - return Optional.of(result); + return result; } else { throw new IllegalStateException("Multiple matches found: " + result + " but " + diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java index 5a6057858c8..aec51b90222 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/RequestContext.java @@ -389,7 +389,7 @@ public class RequestContext { protected T getModelObject(String modelName) { T modelObject = (T) this.model.get(modelName); if (modelObject == null) { - modelObject = (T) this.exchange.getAttribute(modelName); + modelObject = (T) this.exchange.getAttribute(modelName).orElse(null); } return modelObject; } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerView.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerView.java index 7a8f731266b..d32ce9a2584 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerView.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/view/freemarker/FreeMarkerView.java @@ -42,6 +42,7 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContextException; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.MediaType; +import org.springframework.util.MimeType; import org.springframework.web.reactive.result.view.AbstractUrlBasedView; import org.springframework.web.server.ServerWebExchange; @@ -177,7 +178,7 @@ public class FreeMarkerView extends AbstractUrlBasedView { DataBuffer dataBuffer = exchange.getResponse().bufferFactory().allocateBuffer(); try { - Charset charset = getCharset(contentType).orElse(getDefaultCharset()); + Charset charset = getCharset(contentType); Writer writer = new OutputStreamWriter(dataBuffer.asOutputStream(), charset); getTemplate(locale).process(freeMarkerModel, writer); } @@ -191,8 +192,8 @@ public class FreeMarkerView extends AbstractUrlBasedView { return exchange.getResponse().writeWith(Flux.just(dataBuffer)); } - private Optional getCharset(MediaType mediaType) { - return (mediaType != null ? Optional.ofNullable(mediaType.getCharset()) : Optional.empty()); + private Charset getCharset(MediaType mediaType) { + return Optional.ofNullable(mediaType).map(MimeType::getCharset).orElse(getDefaultCharset()); } /**