Spring Boot 基本

Spring Bootで特定のHTTPステータスコードが返却された場合に独自エラー画面を表示してみた

Springフレームワークでは、特定のHTTPステータスコード(例:404(Not Found))が返却された場合に独自のエラー画面に遷移するようにすることができる。

今回は、Spring Bootプロジェクトで、404(Not Found)エラーが発生した場合とそれ以外の場合でエラー画面の遷移先を変更するサンプルプログラムを作成してみたので、共有する。

前提条件

下記記事の実装が完了していること。

IntelliJ IDEA上でGradleを使ってWeb画面のSpring Bootプロジェクトを作成してみたSpring Bootのプロジェクトを新規作成を「IntelliJ IDEA」のメニューから実施しようとしたところ、無料の「Commun...



サンプルプログラムの作成

作成したサンプルプログラムの構成は以下の通り。
サンプルプログラムの構成
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。

404(Not Found)エラーが発生した場合のHTMLファイルの内容は以下の通りで、templates/errorフォルダ下に配置している。

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>404エラー画面</title>
</head>
<body>
    <h1 th:text="${status} + ' ' + ${error}">エラーステータス</h1>
    <p>
        指定されたURLが見つかりませんでした。<br/>
        指定されたURLのパスがコントローラクラスに存在するかどうか確認してください。
        <br/><br/>
        <strong>エラーメッセージ: </strong><br/>
        <span th:text="${message}">エラーメッセージ</span>
    </p>
    <br/><br/>
    <form method="get" th:action="@{/}">
        <input type="submit" value="戻る" />
    </form>
</body>
</html>

なお、上記ファイル内で利用している${status}, ${error}, ${message}は、DefaultErrorAttributesというクラスに含まれる属性である。詳細は以下のサイトを参照のこと。
https://spring.pleiades.io/spring-boot/docs/2.0.0.M7/api/org/springframework/boot/autoconfigure/web/reactive/error/DefaultErrorAttributes.html



また、404(Not Found)以外のエラーが発生した場合のHTMLファイルの内容は以下の通りで、templatesフォルダ下に配置している。

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>エラー画面</title>
</head>
<body>
    <h1 th:text="${status} + ' ' + ${error}">エラーステータス</h1>
    <p>
        エラーが発生しました。下記メッセージを確認してください。<br/><br/>
        <strong>エラーメッセージ: </strong><br/>
        <span th:text="${message}">エラーメッセージ</span>
    </p>
    <br/><br/>
    <form method="get" th:action="@{/}">
        <input type="submit" value="戻る" />
    </form>
</body>
</html>

さらに、初期表示画面の内容は以下の通りで、404(Not Found)エラー、404(Not Found)以外のエラーを発生させるボタンを配置している。

<!DOCTYPE html>
<html lang="ja" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>トップ画面</title>
</head>
<body>
   下記ボタンを押下してください。 <br/><br/>
   <form method="post" th:action="@{/submit_error_no_url}">
       <input type="submit" value="このボタンを押すと404エラーが発生します" />
   </form>
   <br/><br/>
   <form method="post" th:action="@{/submit_error_other}">
       <input type="submit" value="このボタンを押すと404以外のエラーが発生します" />
   </form>
</body>
</html>



また、コントローラクラスの内容は以下の通りで、初期表示処理と、404(Not Found)以外のエラーを発生させる処理を記載している。なお、404エラーはコントローラクラスのパスが存在しない場合に発生するので、ここには記載していない。

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class DemoController {

    /**
     * 初期表示画面を表示する
     * @return 初期表示画面
     */
    @GetMapping("/")
    public String index(){
        return "index";
    }

    /**
     * HTTP 500エラー(404以外)を発生させる
     * @return 存在しない画面
     */
    @PostMapping("/submit_error_other")
    public String submitErrorOther(){
        // 存在しない画面に遷移しようとするため、
        // HTTP 500エラーが発生する
        return "no_page";
    }
}



サンプルプログラムの実行結果

サンプルプログラムの実行結果は、以下の通り。

1) Spring Bootアプリケーションを起動し、「http://(サーバー名):(ポート番号)/」とアクセスすると、以下の画面が表示される。
サンプルプログラムの実行結果_1

2) 初期表示画面で「このボタンを押すと404エラーが発生します」ボタンを押下すると、以下のように、404.html画面に遷移することが確認できる。
サンプルプログラムの実行結果_2_1

サンプルプログラムの実行結果_2_2

3) 初期表示画面で「このボタンを押すと404以外のエラーが発生します」ボタンを押下すると、以下のように、error.html画面に遷移することが確認できる。
サンプルプログラムの実行結果_3_1

サンプルプログラムの実行結果_3_2

要点まとめ

  • 特定のHTTPステータスコードが返却された場合に遷移するエラー画面は、templates/errorフォルダ下に「(HTTPステータスコード).html」という名前で作成すればよい。
  • 一般的なエラー画面は、templatesフォルダ下に「error.html」という名前で作成すればよい。