Spring Boot学习笔记8:统一异常处理
Spring Boot学习笔记8:统一异常处理
统一异常处理
虽然,Spring Boot中实现了默认的error映射,但是在实际应用中,默认的错误页面对用户来说并不够友好,我们通常需要去实现我们自己的异常提示。
下面我们以之前的Spring Bootx学习笔记7:使用Thymeleaf模板引擎渲染web视图为基础,进行统一异常处理的改造。
- 创建一个自定义异常。
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
- 创建一个抛出自定义异常的控制器。这里访问
"/hello"
抛出自定义异常,重定向到"/myError"
。
@Controller
@Controller
public class MyController {
@RequestMapping("/hello")
public String hello() throws MyException {
throw new MyException("我的错误");
}
@RequestMapping("/myError")
public String myError(){
return "myError";
}
}
- 创建全局异常处理类:通过使用
@ControllerAdvice
定义统一的异常处理类,而不是在每个Controller中逐个定义。@ExceptionHandler
用来定义函数针对的异常类型,最后重定向到"/myError"
。注意Model属性会随着重定向而被销毁,所以这里直接使用RedirectAttributesModelMap
对象的addFlashAttribute
方法来添加Model属性。
@ControllerAdvice
public class MyControllerAdvice {
@ExceptionHandler(value = MyException.class)
public String myErrorHandler(RedirectAttributesModelMap modelMap, MyException myException){
modelMap.addFlashAttribute("myException",myException);
return "redirect:/myError";
}
}
- 实现
myError.html
页面展示:在templates
目录下创建myError.html
,将放入Model的属性进行输出。
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<title>统一异常处理</title>
</head>
<body>
<div th:text="${myException.message}"></div>
</body>
</html>
打开浏览器,打开http://http://localhost:8080/hello
重定向跳转到http://http://localhost:8080/myError
,测试结果如下,跳转到了错误页面。
如果是要返回JSON字符串而非转发或重定向视图,与@RestController
类似可以用@RestControllerAdvice
替代@ControllerAdvice
,或者与@RequestMapping
类似在@ExceptionHandler
注解的方法上注解@ResponseBody
。