或许你会很好奇,项目中的异常都是怎么统一处理的?下面我来说说,首先给大家介绍一个注解@ExceptionHandler,用来指明异常的处理类型,如果指定为NullPointException,那么数组越界异常不会进入到这个方法中。@ExceptionHandler可以接受请求处理方法抛出的异常,放在controller里的时候,只对当前的控制器有效。如果项目里有很多的controller控制器,怎么办呢?Spring提供了一个@ControllerAdvice注解,可以应用到所有的控制器上。将所有标记@ExceptionHandler的方法提取出来,放到一个类里,并加上@ControllerAdvice,所有的控制器都可以使用,起到了统一控制全局异常的作用。
定义一个全局的异常处理器,步骤如下:
1、定义一个全局处理器GlobalExceptionHandler 2、添加注@ControllerAdvice
在这个类里可以定义多个方法,不同的方法处理不同的异常。
3、编写一个自定义异常MyException
4、在GlobalExceptionHandler在resolveMyException的方法上添加@ExceptionHandler(MyException.class),指明处理这种异常。
5、编写一个Controller进行测试
在浏览器上进行测试,结果如下:
我们来看下@CcontrollerAdvice注解的源码,如下:
@ControllerAdvice注解被@Component注解标记,因此是可以被Spring注入。
如果我们只想对一部分的控制器起作用,还可以使用basePackageClasses、
assignableTypes、annotations等进行调整控制的范围。
@ControllerAdvice除了这个全局异常处理的功能外,还可以实现全局数据绑定和全局数据预处理,分别是@ModelAttribute和@InitBinder,大家自行研究。