Move status/header handling into FragmentsRendering

Based on feedback from htmx-spring-boot. It's more generally useful
to process those from within DefaultFragmentsRendering rather than
in ModelAndViewMethodReturnValueHandler. That way a custom
return value handler can create a FragmentsRendering as well and
get the same result.

See gh-33194
This commit is contained in:
rstoyanchev
2024-08-09 17:59:50 +03:00
parent ce5e247c3b
commit 0d64c90a79
4 changed files with 11 additions and 16 deletions

View File

@@ -18,12 +18,8 @@ package org.springframework.web.servlet.mvc.method.annotation;
import java.util.Collection;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpHeaders;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.PatternMatchUtils;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodReturnValueHandler;
@@ -100,13 +96,6 @@ public class ModelAndViewMethodReturnValueHandler implements HandlerMethodReturn
}
if (returnValue instanceof FragmentsRendering rendering) {
mavContainer.setStatus(rendering.status());
HttpHeaders headers = rendering.headers();
if (!headers.isEmpty()) {
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
Assert.state(response != null, "No HttpServletResponse");
headers.forEach((name, values) -> values.forEach(value -> response.addHeader(name, value)));
}
mavContainer.setView(rendering);
return;
}

View File

@@ -101,6 +101,14 @@ final class DefaultFragmentsRendering implements FragmentsRendering {
@Nullable Map<String, ?> model, HttpServletRequest request, HttpServletResponse response)
throws Exception {
if (this.status != null) {
response.setStatus(this.status.value());
}
if (!this.headers.isEmpty()) {
this.headers.forEach((name, values) -> values.forEach(value -> response.addHeader(name, value)));
}
if (model != null) {
model.forEach((key, value) ->
this.modelAndViews.forEach(mv -> mv.getModel().putIfAbsent(key, value)));