@ControllerAdviceによる例外処理、input処理の設定


概要

@ControllerAdviceアノテーションを使うことで例外発生時の処理やRequestParamなどでのデータバインドの設定を行うことができる。

ソースコード

コントローラーアドバイス
SampleControllerAdvice.java

@ControllerAdvice
public class SampleControllerAdvice {
    
    /**
     * NullPointerException発生時の処理
     * @param exception
     * @param model
     * @return
     */
    @ExceptionHandler(NullPointerException.class)
    public String nullError(NullPointerException exception, Model model) {
        model.addAttribute("errMsg", exception.getMessage());
        return "index_null";
    }
    
    /**
     * RequestParamやPathVariableの設定
     * StringTrimmerEditorで空白をnullに設定する
     * @param binder
     */
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        // 未入力のStringをnullに設定する
        binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}
コントローラー
SampleController.java
@Controller
public class SampleController {
    
    @GetMapping(value="/")
    public String index(Model model) {
        return "index";
    }
    
    /**
     * 
     * @return
     */
    @PostMapping("/nullPointerException")
    public String nullPointerExceptionCtl(@RequestParam(required = false) String name){
        throw new NullPointerException("NullPointerException:" + name);
    }
}
ビュー
index.html
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>サンプルタイトル</h1>
    <form method="post" th:action="@{/nullPointerException}">
        <input type="text" id="name" name="name">
        <button type="submit">NullPointerException</button>
    </form>
</body>
</html>
index_null.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <p th:text="${errMsg}"></p>
</body>
</html>

git

https://gitlab.com/nk19940709nk/nakaiproject/-/tree/main/JunitSample1/src/main