@ControllerAdvice @ExceptionHandler @ResponseStatus spring全局异常拦截

1:@ControllerAdvice:全局捕获异常,异常集中处理,更好的使业务逻辑与异常处理剥离开

  • 把@ControllerAdvice定义在一个类上,该类则负责捕获所有@RequestMapping上发生的异常(包括controller调用的service)

2:@ExceptionHandler(value = Exception.class):统一处理某一类异常

  • 把@ExceptionHandler(value = Exception.class)定义在一个方法上,声明该方法用于捕获value所指的类型的异常(注意:当该异常的子父类都被声明时,按照先子后父的顺序进行捕获)
  • 在方法中捕获到异常进行处理后,即可重定向到一个视图,也可返回一个json;此时需要@ResponseBody。

3:@ResponseBody

  •    和@ExceptionHandler一同用在方法上,声明在方法中捕获到异常并进行处理后,返回的数据类型不是html页面,而是某种格式的数据。(@ResponseBody的本质作用)

 4:@ResponseStatus:将某种异常映射为HTTP状态码,可用在方法上,也可以用在类上(自定义运行时异常类)。

  • 当作用到异常类上时,实际上就是将该异常类的对象转换成某个HTTP状态码,然后以该状态码去通知客户端。(本文不再讨论)
  • 当作用到方法上时,实际上就是改变方法返回值的HTTP状态码,然后返回给客户端。

例子如下:

补充:上图例子虽然是对GunsException异常的捕获,并在方法中进行了处理,最终在方法返回时,如果没有加上@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR),则该方法返回给客户端的状态码是200(即正常状态码),如果是ajax发送的请求,则会回调success()方法。但是加上@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)之后,该方法返回给客户端的状态码就变了。所以:@ResponseStatus如果加在方法上,就是改变方法返回值的HTTP状态码。

原文地址:https://www.cnblogs.com/hzcya1995/p/13302506.html