第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
解説
フォーム画面で確認ボタンを押すと、エラーページが表示されます。
表示する際に出したい文言を設定することで、エラー毎に表示内容を変えることができます。