200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > RestControllerAdvice作用及原理---自定义异常处理(全局异常处理)

RestControllerAdvice作用及原理---自定义异常处理(全局异常处理)

时间:2022-10-19 20:11:12

相关推荐

RestControllerAdvice作用及原理---自定义异常处理(全局异常处理)

前言

一直想开发一个功能比较强大的项目,但是一直没有动手,最近终于有点时间来折腾它了。由于时隔两年没有接触前端了,所以需要一个小项目先练练手感。等这个项目完工之后在着手搞一个大工程。都说好记星不如烂笔头,现在就将这一个过程记录下来,万一有什么踩坑的地方,也可以提示后来人。

官网地址

背景

在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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。