はじめに

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>