SpringBoot 例外のサンプル(ControllerAdvice)

Spring Bootの例外処理でExceptionHandler,ControllerAdviceを使用するサンプルです。

目次

サンプル 例外処理のサンプル / pom.xml
  1.コントローラのメソッドで例外処理を行う
  2.1つのコントローラを単位として例外処理を行う(@ExceptionHandler)
  3.すべてのコントローラを単位として例外処理を行う(@ControllerAdvice)

例外処理(ControllerAdvice)のサンプル

3つの例外処理のサンプルがあります。

「1.コントローラのメソッドで例外処理を行う」と「2.1つのコントローラを単位として例外処理を行う」は、MainController.javaに例外処理を記述します。

「3.すべてのコントローラを単位として例外処理を行う」は、TestControllerAdvice.javaに例外処理を記述します。

TestException.javaは、独自の例外クラスで確認用です。

以下のURLでアクセスします。
http://localhost:8765/test1

githubにコードがあります。
https://github.com/ut23405/springboot/tree/master/springboot-ControllerAdvice

 

独自の例外クラス(TestException.java)

package com.example.demo;

public class TestException extends RuntimeException {

	private static final long serialVersionUID = 1L; 

	TestException(String msg){
		super(msg);
	}
}

3行目は、RuntimeExceptionクラスを継承しています。Exceptionクラスでも問題ありません。
7~9行目は、コンストラクタです。
8行目のsuper(msg)は、継承元クラスのコンストラクタを指します。
引数のmsgの値は、エラー時の文言の表示で使用します。

ビューのファイル(index.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
  <head>
    <meta charset="utf-8" />
    <title>check</title>
  </head>
  <body>
    <p th:text="${message1}"></p>
  </body>
</html>

8行目は、例外発生時のメッセージを表示します。

1.コントローラのメソッドで例外処理を行う

コントローラのクラスです。(MainController.java)

package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test1")
public class MainController {

    @GetMapping()
	public String index(Model model)  {
	try {
		runSample();
	} catch (TestException e) {
		model.addAttribute("message1",e);
		return "test1/index";
	}
	return "test1/index";
	}
    
    void runSample()   {
		int i = 5;
		if (i == 5) {
			throw new TestException("独自の例外です"); 
		}
	}
}

14行目は、22行目のメソッドを呼び出します。try-catchで囲まれています。
25行目は、独自の例外をthrowしています。

実行結果

以下のように、エラーメッセージが表示されます。

2.1つのコントローラを単位として例外処理を行う(@ExceptionHandler)

コントローラのクラスです。(MainController.java)

package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test1")
public class MainController {

    @GetMapping()
	public String index(Model model)  {
		runSample();
		return "test1/index";
	}
    
    void runSample()   {
		int i = 5;
		if (i == 5) {
			throw new TestException("独自の例外です"); 
		}
	}
	@ExceptionHandler(TestException.class)
	public String testExceptionHandle(TestException e, Model model) {
		model.addAttribute("message1",e);
		return "test1/index";
	}
}

24行目に@ExceptionHandlerを追加します。引数は独自の例外クラスです。
TestExceptionの例外が発生したときに、その下のメソッドが実行されます。
1つのコントローラ単位でエラーをキャッチします。
結果は、上記1番と同じくブラウザに「com.example.demo.TestException: 独自の例外です」と表示されます。

3.すべてのコントローラを単位として例外処理を行う(@ControllerAdvice)

コントローラのクラスです。(MainController.java)

package com.example.demo;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/test1")
public class MainController {

    @GetMapping()
	public String index(Model model)  {
		runSample();
		return "test1/index";
	}
    
    void runSample()   {
		int i = 5;
		if (i == 5) {
			throw new TestException("独自の例外です"); 
		}
	}
}

上記2番との違いは、ExceptionHandlerアノテーションとメソッドがありません。

以下は、ControllerAdviceのクラスです。(TestControllerAdvice.java)

package com.example.demo;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class TestControllerAdvice {

	@ExceptionHandler(TestException.class)
	public String testExceptionHandle(TestException e, Model model) {
		model.addAttribute("message1",e);
		return "test1/index";
	}
}

7行目にControllerAdviceアノテーションを追加します。全コントローラが対象になります。
10~14行目は、上記2番の24~28行目と同じです。
結果は、上記1番と同じくブラウザに「com.example.demo.TestException: 独自の例外です」と表示されます。

pom.xml

必要なライブラリです。

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

関連の記事

SpringBoot フォームの値を別画面に渡す
SpringBoot フォームで入力チェック(バリデーション)

△上に戻る