Springフレームワークでは、特定のHTTPステータスコード(例:404(Not Found))が返却された場合に独自のエラー画面に遷移するようにすることができる。
今回は、Spring Bootプロジェクトで、404(Not Found)エラーが発生した場合とそれ以外の場合でエラー画面の遷移先を変更するサンプルプログラムを作成してみたので、共有する。
前提条件
下記記事の実装が完了していること。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通り。
なお、上記の赤枠は、前提条件のプログラムから追加/変更したプログラムである。
404(Not Found)エラーが発生した場合のHTMLファイルの内容は以下の通りで、templates/errorフォルダ下に配置している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <!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フォルダ下に配置している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <!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)以外のエラーを発生させるボタンを配置している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <!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エラーはコントローラクラスのパスが存在しない場合に発生するので、ここには記載していない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | 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」という名前で作成すればよい。