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