はじめに
Spring Boot + Thymeleafの構成でエラー画面をカスタマイズする方法について
検証version
- Spring Boot 1.3.5
- Thymeleaf 2.1.4
- Bootstrap 3.3.6
Whitelabel Error Page
Spring Bootで404等のエラーが発生したときに表示されるエラーページはWhitelabel Error PageというSpringがデフォルトで用意している味気ない固定のエラーページになる。
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Fri Jul 22 18:11:48 JST 2016
There was an unexpected error (type=Not Found, status=404).
No message available
error.html
Thymeleafを組み合わせている場合、エラー画面を独自に定義するには、error.htmlを用意すればよい。
/src/main/resources/templates/error.html
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
xmlns:layout="http://www.myproject/web/thymeleaf/layout"
layout:decorator="common/layout">
<head>
</head>
<body>
<div class="container" layout:fragment="content">
<div id="information" class="alert alert-danger alert-dismissible">
エラーが発生しました。
</div>
</div>
</body>
</html>
エラー種別ごとの詳細カスタマイズ
404エラーの時は別のエラー画面を表示するなどのカスタマイズを行うには、EmbeddedServletContainerCustomizerインタフェースをimplementしたクラスとErrorController.javaを実装し、さらに404用のHTMLを用意すればよい。
/src/main/java/com/sample/system/servletcontainer/Customizer.java
import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.ErrorPage;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
@Component
public class Customizer implements EmbeddedServletContainerCustomizer {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
}
}
/src/main/java/com/sample/web/error/ErrorController.java
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class ErrorController {
@RequestMapping(value = "/404", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.NOT_FOUND)
public String notFound() {
return "404";
}
}
/src/main/resources/templates/404.html
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"
xmlns:layout="http://www.myproject/web/thymeleaf/layout"
layout:decorator="common/layout">
<head>
</head>
<body>
<div class="container" layout:fragment="content">
<div id="information" class="alert alert-danger">
404 Not Found<br>
ページが見つかりません。
</div>
</div>
</body>
</html>