第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

解説

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