第4章 エラー実装をしてみよう
4.3 @ExceptionHandler
@ExceptionHandlerアノテーションを付けたメソッドを用意すると、例外処理を実装できます。アノテーションの引数に例外クラスを使用することで、例外毎の処理を実行できます。また、@ExceptionHandlerを付けたメソッドは、複数用意できます。
今回は、サンプルコードでわざとエラーが発生するような処理を書いてみましょう。
実行結果(先ほど作成したフォームの確認ボタンを押下するとエラーが発生する)
フォルダ構造
【ErrorController.java】(追記)
import org.springframework.web.bind.annotation.ExceptionHandler; ⋮ /** * 「/check」へPOST送信された場合 */ @PostMapping("/check2") // POSTデータをBookインスタンスとして受け取る public ModelAndView check2(@ModelAttribute @Validated(Book.All.class) Book book, BindingResult result, ModelAndView mav) { Optional < Book > optional_book = bookinfo.findByIsbn(book.getIsbn()); //以下を追記 throw new IllegalStateException("ISBNが見つかりません"); //以下をコメントアウト //重複チェック //if (optional_book.isPresent()) { // mav.addObject("message", "入力ISBNは既にDBに存在します。"); // // 画面に出力するViewを指定 // mav.setViewName("checkForm2"); //} else { // 画面に出力するViewを指定 // mav.setViewName("checkResult2"); //} // //return mav; } /** * Exception発生時の処理メソッド. */ @ExceptionHandler(Exception.class) public ModelAndView ExceptionHandler(Exception e) { ModelAndView mav = new ModelAndView(); mav.addObject("errorMessage", "エラー内容:" + e.getMessage()); //画面に出力するViewを指定 mav.setViewName("error"); //ModelとView情報を返す return mav; }
【error.html】
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>エラー画面</title> <link rel="stylesheet" th:href="@{/css/style.css}"> </head> <body> <!-- ブラウザ全体 --> <div id="wrap"> <div id="main" class="container"> <h2>●●エラー●●</h2> <table align="center"> <tr> <td th:text="${errorMessage}"> </td> </tr> </table> </div> </div> </body> </html>
アプリケーションにアクセス
以下のアドレスからHelloWorldアプリケーションにアクセスします。
URL:http://localhost:8080/check2
解説
フォーム画面で確認ボタンを押すと、エラーページが表示されます。
表示する際に出したい文言を設定することで、エラー毎に表示内容を変えることができます。