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>
関連の記事