Fix HTTP status error template rendering in WebFlux
Prior to this commit, a change in `HttpStatus.toString` since SPR-16898 prevented the default WebFlux `ErrorWebExceptionHandler` to render template views for exact HTTP status (e.g. "404.html"). This issue does not affect the resolution of series, like "4xx.html". This commit fixes `DefaultErrorWebExceptionHandler` to use `HttpStatus.value()` when attempting to resolve error views. Closes gh-15083
This commit is contained in:
parent
f42a653604
commit
da53a0b8d5
|
|
@ -122,7 +122,7 @@ public class DefaultErrorWebExceptionHandler extends AbstractErrorWebExceptionHa
|
|||
ServerResponse.BodyBuilder responseBody = ServerResponse.status(errorStatus)
|
||||
.contentType(MediaType.TEXT_HTML);
|
||||
return Flux
|
||||
.just("error/" + errorStatus.toString(),
|
||||
.just("error/" + errorStatus.value(),
|
||||
"error/" + SERIES_VIEWS.get(errorStatus.series()), "error/error")
|
||||
.flatMap((viewName) -> renderErrorView(viewName, responseBody, error))
|
||||
.switchIfEmpty(this.errorProperties.getWhitelabel().isEnabled()
|
||||
|
|
|
|||
|
|
@ -257,6 +257,43 @@ public class DefaultErrorWebExceptionHandlerIntegrationTests {
|
|||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void exactStatusTemplateErrorPage() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("server.error.whitelabel.enabled=false",
|
||||
"spring.mustache.prefix=" + getErrorTemplatesLocation())
|
||||
.run((context) -> {
|
||||
WebTestClient client = WebTestClient.bindToApplicationContext(context)
|
||||
.build();
|
||||
String body = client.get().uri("/notfound")
|
||||
.accept(MediaType.TEXT_HTML).exchange().expectStatus()
|
||||
.isNotFound().expectBody(String.class).returnResult()
|
||||
.getResponseBody();
|
||||
assertThat(body).contains("404 page");
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void seriesStatusTemplateErrorPage() {
|
||||
this.contextRunner
|
||||
.withPropertyValues("server.error.whitelabel.enabled=false",
|
||||
"spring.mustache.prefix=" + getErrorTemplatesLocation())
|
||||
.run((context) -> {
|
||||
WebTestClient client = WebTestClient.bindToApplicationContext(context)
|
||||
.build();
|
||||
String body = client.get().uri("/badRequest")
|
||||
.accept(MediaType.TEXT_HTML).exchange().expectStatus()
|
||||
.isBadRequest().expectBody(String.class).returnResult()
|
||||
.getResponseBody();
|
||||
assertThat(body).contains("4xx page");
|
||||
});
|
||||
}
|
||||
|
||||
private String getErrorTemplatesLocation() {
|
||||
String packageName = getClass().getPackage().getName();
|
||||
return "classpath:/" + packageName.replace('.', '/') + "/templates/";
|
||||
}
|
||||
|
||||
@Test
|
||||
public void invalidAcceptMediaType() {
|
||||
this.contextRunner.run((context) -> {
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
404 page
|
||||
Loading…
Reference in New Issue