Merge branch '5.3.x'
This commit is contained in:
commit
4b18cc94ea
|
@ -40,6 +40,8 @@ import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.web.reactive.result.view.RedirectView;
|
||||||
|
import org.springframework.web.reactive.result.view.View;
|
||||||
import org.springframework.web.reactive.result.view.ViewResolver;
|
import org.springframework.web.reactive.result.view.ViewResolver;
|
||||||
import org.springframework.web.server.ServerWebExchange;
|
import org.springframework.web.server.ServerWebExchange;
|
||||||
|
|
||||||
|
@ -194,6 +196,7 @@ final class DefaultRenderingResponseBuilder implements RenderingResponse.Builder
|
||||||
.switchIfEmpty(Mono.error(() ->
|
.switchIfEmpty(Mono.error(() ->
|
||||||
new IllegalArgumentException("Could not resolve view with name '" + name() + "'")))
|
new IllegalArgumentException("Could not resolve view with name '" + name() + "'")))
|
||||||
.flatMap(view -> {
|
.flatMap(view -> {
|
||||||
|
setStatus(view);
|
||||||
List<MediaType> mediaTypes = view.getSupportedMediaTypes();
|
List<MediaType> mediaTypes = view.getSupportedMediaTypes();
|
||||||
return view.render(model(),
|
return view.render(model(),
|
||||||
contentType == null && !mediaTypes.isEmpty() ? mediaTypes.get(0) : contentType,
|
contentType == null && !mediaTypes.isEmpty() ? mediaTypes.get(0) : contentType,
|
||||||
|
@ -201,6 +204,16 @@ final class DefaultRenderingResponseBuilder implements RenderingResponse.Builder
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setStatus(View view) {
|
||||||
|
if (view instanceof RedirectView) {
|
||||||
|
HttpStatus httpStatus = HttpStatus.resolve(rawStatusCode());
|
||||||
|
if (httpStatus != null && httpStatus.is3xxRedirection()) {
|
||||||
|
RedirectView redirectView = (RedirectView) view;
|
||||||
|
redirectView.setStatusCode(httpStatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
package org.springframework.web.reactive.function.server;
|
package org.springframework.web.reactive.function.server;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.time.ZonedDateTime;
|
import java.time.ZonedDateTime;
|
||||||
import java.time.format.DateTimeFormatter;
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.time.temporal.ChronoUnit;
|
import java.time.temporal.ChronoUnit;
|
||||||
|
@ -37,6 +38,7 @@ import org.springframework.http.ResponseCookie;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
import org.springframework.web.reactive.result.view.AbstractView;
|
import org.springframework.web.reactive.result.view.AbstractView;
|
||||||
|
import org.springframework.web.reactive.result.view.RedirectView;
|
||||||
import org.springframework.web.reactive.result.view.View;
|
import org.springframework.web.reactive.result.view.View;
|
||||||
import org.springframework.web.reactive.result.view.ViewResolver;
|
import org.springframework.web.reactive.result.view.ViewResolver;
|
||||||
import org.springframework.web.reactive.result.view.ViewResolverSupport;
|
import org.springframework.web.reactive.result.view.ViewResolverSupport;
|
||||||
|
@ -47,8 +49,10 @@ import org.springframework.web.testfixture.server.MockServerWebExchange;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.BDDMockito.given;
|
import static org.mockito.BDDMockito.given;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Arjen Poutsma
|
* @author Arjen Poutsma
|
||||||
|
@ -155,6 +159,41 @@ public class DefaultRenderingResponseTests {
|
||||||
.verify();
|
.verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void writeTo() {
|
||||||
|
Map<String, Object> model = Collections.singletonMap("foo", "bar");
|
||||||
|
RenderingResponse renderingResponse = RenderingResponse.create("view")
|
||||||
|
.status(HttpStatus.FOUND)
|
||||||
|
.modelAttributes(model)
|
||||||
|
.build().block(Duration.of(5, ChronoUnit.MILLIS));
|
||||||
|
assertThat(renderingResponse).isNotNull();
|
||||||
|
|
||||||
|
MockServerWebExchange exchange = MockServerWebExchange.from(MockServerHttpRequest.get("http://localhost"));
|
||||||
|
MediaType contentType = MediaType.APPLICATION_PDF;
|
||||||
|
exchange.getResponse().getHeaders().setContentType(contentType);
|
||||||
|
|
||||||
|
ViewResolver viewResolver = mock(ViewResolver.class);
|
||||||
|
RedirectView view = mock(RedirectView.class);
|
||||||
|
given(viewResolver.resolveViewName(eq("view"), any())).willReturn(Mono.just(view));
|
||||||
|
given(view.render(model, contentType, exchange)).willReturn(Mono.empty());
|
||||||
|
|
||||||
|
List<ViewResolver> viewResolvers = new ArrayList<>();
|
||||||
|
viewResolvers.add(viewResolver);
|
||||||
|
|
||||||
|
HandlerStrategies mockConfig = mock(HandlerStrategies.class);
|
||||||
|
given(mockConfig.viewResolvers()).willReturn(viewResolvers);
|
||||||
|
|
||||||
|
ServerResponse.Context context = mock(ServerResponse.Context.class);
|
||||||
|
given(context.viewResolvers()).willReturn(viewResolvers);
|
||||||
|
|
||||||
|
Mono<Void> result = renderingResponse.writeTo(exchange, context);
|
||||||
|
StepVerifier.create(result)
|
||||||
|
.expectComplete()
|
||||||
|
.verify();
|
||||||
|
|
||||||
|
verify(view).setStatusCode(HttpStatus.FOUND);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void defaultContentType() {
|
public void defaultContentType() {
|
||||||
Mono<RenderingResponse> result = RenderingResponse.create("view").build();
|
Mono<RenderingResponse> result = RenderingResponse.create("view").build();
|
||||||
|
|
Loading…
Reference in New Issue