Springフレームワークでは、特定のHTTPステータスコード(例:404(Not Found))が返却された場合に独自のエラー画面に遷移するようにすることができる。
今回は、Spring Bootプロジェクトで、404(Not Found)エラーが発生した場合とそれ以外の場合でエラー画面の遷移先を変更するサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。

なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。
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://(サーバー名):(ポート番号)/」とアクセスすると、以下の画面が表示される。

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


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


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





