SpringBoot学习笔记之异常处理

在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页面内容,证明自定义异常已经成功被拦截。

访问: http://localhost:8080/web/jsonException 显示下面json数据。
补充:如果全部异常处理返回json,那么可以使用 @RestControllerAdvice 代替 @ControllerAdvice ,这样在方法上就可以不需要添加 @ResponseBody。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值