前言
一直想开发一个功能比较强大的项目,但是一直没有动手,最近终于有点时间来折腾它了。由于时隔两年没有接触前端了,所以需要一个小项目先练练手感。等这个项目完工之后在着手搞一个大工程。都说好记星不如烂笔头,现在就将这一个过程记录下来,万一有什么踩坑的地方,也可以提示后来人。
官网地址
背景
在spring 3.2中,新增了@ControllerAdvice 注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。
@RestControllerAdvicepublic class GlobalException {/*** 读取数据库异常* @param e* @return*/@ExceptionHandler(SQLException.class)public ResponseService mySqlException(SQLException e) {if (e instanceof SQLIntegrityConstraintViolationException) {return ResponseService.error("该数据有关联数据,操作失败!");}return ResponseService.error("数据库异常,操作失败!");}}
或者
@RestControllerAdvice public class MyControllerAdvice {/*** 应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器* @param binder*/@InitBinderpublic void initBinder(WebDataBinder binder) {}/*** 把值绑定到Model中,使全局@RequestMapping可以获取到该值* @param model*/@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("author", "Magical Sam");}/*** 全局异常捕捉处理* @param ex* @return*/// @ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {Map map = new HashMap();map.put("code", 100);map.put("msg", ex.getMessage());return map;}}
启动应用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都会作用在 被 @RequestMapping 注解的方法上。@ExceptionHandler 拦截了异常,我们可以通过该注解实现自定义异常处理。其中,@ExceptionHandler 配置的 value 指定需要拦截的异常类型,上面拦截了 Exception.class 这种异常。
自定义异常处理(全局异常处理)
自定义异常类public class MyException extends RuntimeException {public MyException(String code, String msg) {this.code = code;this.msg = msg;}private String code;private String msg;// getter & setter}
如果使用的是spring事务的话,需要注意:spring 对于 RuntimeException 异常才会进行事务回滚.
全局异常处理类@RestControllerAdvice public class MyControllerAdvice {/*** 全局异常捕捉处理* @param ex* @return*/// @ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {Map map = new HashMap();map.put("code", 100);map.put("msg", ex.getMessage());return map;}/*** 拦截捕捉自定义异常 MyException.class* @param ex* @return*/// @ResponseBody@ExceptionHandler(value = MyException.class)public Map myErrorHandler(MyException ex) {Map map = new HashMap();map.put("code", ex.getCode());map.put("msg", ex.getMsg());return map;}}
测试
@RequestMapping("/test")public String home() throws Exception {// throw new Exception("mjdai 错误");throw new MyException("506", "mjdai 错误");}
启动应用,访问:http://localhost:8080/home
{"msg":"mjdai 错误","code":"506"}
如果使用的是ControllerAdvice ,那么需要在加上ResponseBody
@ResponseBody@ExceptionHandler(value = MyException.class)public Map myErrorHandler(MyException ex) {Map map = new HashMap();map.put("code", ex.getCode());map.put("msg", ex.getMsg());return map;}