Java Spring Boot 例外処理のサンプル

Java Spring Bootの例外処理のサンプルです。

目次

サンプル 環境
サンプル 1.コントローラのメソッドで例外処理を行う
  2.1つのコントローラを単位として例外処理を行う
  3.すべてのコントローラを単位として例外処理を行う

環境

今回作成するファイルは以下の赤枠の部分です。

独自の例外クラス(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/message1";
	}
	return "test1/index";
	}
    
    void runSample()   {
		int i = 5;
		if (i == 5) {
			throw new TestException("独自の例外です"); 
		}
	}
}

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

実行結果

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

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

コントローラのクラスです。(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.すべてのコントローラを単位として例外処理を行う

コントローラのクラスです。(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: 独自の例外です」と表示されます。

関連の記事

Java Spring Boot フォームの値を別画面に渡す
Java Spring Boot フォームの値を入力チェック
Java Spring Boot DI(依存性の注入)のサンプル

△上に戻る