Spring异常处理@ControllerAdvice+@ExceptionHandler注解的使用
1.注解介绍
前言:
对于与数据库相关的 Spring MVC 项目,我们通常会把事务配置在Service层,当数据库操作失败时让 Service 层抛出运行时异常,Spring 事务管理器就会进行回滚。
如此一来,我们的 Controller 层就不得不进行 try-catch Service 层的异常,否则会返回一些不友好的错误信息到客户端。但是,Controller 层每个方法体都写一些模板化的 try-catch 的代码,很难看也难维护,特别是还需要对 Service 层的不同异常进行不同处理的时候。
(1)在Spring里,我们可以使用@ControllerAdvice来声明一些全局性的东西,最常见的是结合@ExceptionHandler注解用于全局异常的处理。
(2)@ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的;
注意:@ControllerAdvice+@ExceptionHandler只能处理 Controller 层未捕获(往外抛)的异常,对于 Interceptor(拦截器)层的异常,Spring 框架层的异常,就无能为力了。
2.基本使用方法
(1)@ControllerAdvice 注解定义全局异常处理类,确保此GlobalExceptionHandler类能被扫描到并装载进 Spring 容器中
(2)Spring的@ExceptionHandler可以用来统一处理方法抛出的异常,当我们使用这个@ExceptionHandler注解时,
①我们需要定义一个异常的处理方法,
②@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常
实例代码如下
//@ControllerAdvice:异常集中处理,对Controller层进行拦截 //写个@ControllerAdvice就可以使用了,加上annotations作用:拦截加了RestController,Controller注解的类 @ControllerAdvice(annotations = {RestController.class, Controller.class}) public class GlobalExceptionHandler { //异常处理方法 @ExceptionHandler(SQLIntegrityConstraintViolationException.class) public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) { System.out.println("抛异常了:" + ex); }