写项目的时候,为了统一管理项目可能报的异常,一般来说是自己实现一个自定义的异常类(例如extends RuntimeException)。但是,这样做虽然很灵活的处理了我们将来要面对的异常,但是在业务代码多处需要抛异常的地方也留下了很多隐患。比如说,try{}catch{}处理可能的异常,我们必须面对代码冗余,阅读困难的弊端;throws处理,异常则会在控制台直接打印,开发阶段控制台可见,这都还好,部署阶段控制台很难去查看,异常的信息也就遗失了。所以,为了统一管理,做好异常的处理,一般选择@ControllerActive进行异常的统一处理
@ControllerActive作用范围
正如同注解的名字,该注解是增强@Controller而存在的,对于需要进行增强的代码,也只能限制在@ControllerActive和@Service调用栈的一系列过程中。
@ControllerActive应用场景1 -(全局异常捕获)
我们可以在注@ControllerActive的类上定义多个方法,不同的方法处理不同的异常,例如专门处理空指针的方法、专门处理数组越界的方法。
为了针对不同的异常,这里需要在方法上注明@ExceptionHandler(Exception.class),来明确该方法捕获的特定异常。
@ControllerActive应用场景2 -(全局数据绑定)
当然该注解也不仅仅用来捕获异常(捕获异常只是大家比较常用的方式)。我们还可以用来做一些初始化的数据操作,例如:将一些公共的数据定义在添加了 @ControllerAdvice 注解的类中,这样在每一个 Controller 的接口中,就都能够访问导致这些数据。
下图中,方法使用 @ModelAttribute 标记该方法的返回数据是一个全局数据。定义完成后,在任何一个Controller 的接口中,都可以获取到这里定义的数据。
@ControllerActive应用场景3 -(全局数据预处理)
如果有两个实体类中的属性同名,并且在某个方法中用接收的两个参数都是上述两个实体类。那么SpringMVC在映射参数的时候,会分不清同名的属性值到底是属于哪一个实体类的。这时候就可以用@ControllerActive进行数据的预处理,也就是取别名。
评论区