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)
|
ServerResponse.BodyBuilder responseBody = ServerResponse.status(errorStatus)
|
||||||
.contentType(MediaType.TEXT_HTML);
|
.contentType(MediaType.TEXT_HTML);
|
||||||
return Flux
|
return Flux
|
||||||
.just("error/" + errorStatus.toString(),
|
.just("error/" + errorStatus.value(),
|
||||||
"error/" + SERIES_VIEWS.get(errorStatus.series()), "error/error")
|
"error/" + SERIES_VIEWS.get(errorStatus.series()), "error/error")
|
||||||
.flatMap((viewName) -> renderErrorView(viewName, responseBody, error))
|
.flatMap((viewName) -> renderErrorView(viewName, responseBody, error))
|
||||||
.switchIfEmpty(this.errorProperties.getWhitelabel().isEnabled()
|
.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
|
@Test
|
||||||
public void invalidAcceptMediaType() {
|
public void invalidAcceptMediaType() {
|
||||||
this.contextRunner.run((context) -> {
|
this.contextRunner.run((context) -> {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
404 page
|
||||||
Loading…
Reference in New Issue