在spring 3.2中,
新增了@ControllerAdvice
注解,
可以用于定义@ExceptionHandler
、@InitBinder、@ModelAttribute,
并应用到所有@RequestMapping中
。参考:
@ControllerAdvice 文档
spring boot 默认情况下会映射到 /error 进行异常处理,但是提示并不十分友好,下面自定义异常处理,提供友好展示。
1)、编写自定义异常类:
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
注意:spring 对于 RuntimeException 异常才会进行事务回滚。
2)、全局异常处理类
@ControllerAdvice
public class GlobalExceptionHandler {
public static final String DEFAULT_ERROR_VIEW="error";
@ExceptionHandler(value=Exception.class)
public ModelAndView defaultErrorHander(HttpServletRequest req,Exception e)throws Exception{
ModelAndView mav=new ModelAndView();
mav.addObject("exception",e);
mav.addObject("url",req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;
}
@ExceptionHandler(value = MyException.class)
@ResponseBody
public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception {
ErrorInfo<String> r = new ErrorInfo<>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData("Some Data");
r.setUrl(req.getRequestURL().toString());
return r;
}
}
3)、controller中抛出异常进行测试。
@RequestMapping("/testException")
public String hello()throws Exception{
throw new Exception("发生异常");
}
@RequestMapping("/jsonException")
public String json() throws MyException {
throw new MyException("发生错误2");
}
4)、错误信息模板
error.ftl,需要入在resources目录下
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>统一异常处理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="${url}"></div>
<div th:text="${exception.message}"></div>
</body>
</html>
启动应用,访问:
http://localhost:8080/web/testException
,正常显示error.ftl页面内容,证明自定义异常已经成功被拦截。
补充:如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。