SpringBoot 自定义切面完成异常处理实现代码优化,减少大量 try catch的使用
目标:
减少代码中Controller层方法上的 try catch 代码,实现不在方法上写try catch 也能完成同样的异常处理功能!
实现过程:
1、定义一个作用于方法上的注解,代码如下
//定义一个写在方法上的注解
@Target(ElementType.METHOD)
//此注解会在class中存在,运行时可通过反射获取
@Retention(RetentionPolicy.RUNTIME)
public @interface NingExceptionAop {
}
新建注解没啥好说的。
2、新建错误处理切面类
package com.qingning.common.aop;
import com.qingning.common.exception.NingException;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Component
@Aspect
//继承BaseAspect
//切面类---用于实现切面的功能
public class NingExceptionAspect {
//定义第一个切面
@Pointcut(value = "execution(* com.qingning.controller.back.user.BackUserController.*(..)) && @annotation(com.qingning.common.aop.NingExceptionAop)")
public void pointcut(){};
//若切面方法运行代码后有错误抛出,则进入此处进行操作
@AfterThrowing(value = "pointcut()" , throwing = "e")
public Object afterThrowing(Throwable e){
System.out.println("错误提示为: "+e.toString());
//若包含自定义的错误处理类则抛出错误
if(e.toString().contains("NingException")){
NingException n = (NingException) e;
throw new NingException(n.getCode(),n.getMassage());
}else {
//若不包含自定义的错误处理类则新定义一个错误处理类
throw new NingException(202,"系统异常!");
}
}
}
其中你可以使用自定义的异常处理类处理报错信息
详见文章 《SpringBoot 全局异常处理类》(点击文章名即可转跳)
使用@Pointcut注解时要注意
1、@Pointcut(“execution()”)表示的是该切面的作用范围 execution()参数为 *
com.qingning.controller.back.user.BackUserController.*(…) 其中 参数第一个 * 表示切面方法返回值为object,后面的 com.qingning.controller.back.user.BackUserController. *
表示切面的作用范围的类路径,精确到方法上,以我的代码为例就是指该切面作用于BackUserController类下所有方法,最后的(…)表示的是不限制BackUserController中的方法参数类型。
2、@Pointcut(“@annotation(com.qingning.common.aop.NingExceptionAop)")
表示的是那个注解才能触发该切面。参数是自定义注解的类路径,例如我的就是,在方法上添加@NingExceptionAop时,才会触发该切面
3、在方法上使用注解
@RestController
public class BackUserController {
@RequestMapping(value = "/addBackUser")
//全局异常处理优化注解
@NingExceptionAop()
public String addBackUser(int number){
if (0==number){
return "运行正常!";
}else if(1==number){
throw new RuntimeException("这是运行是普通异常!");
}else if(2==number){
throw new NingException(204,"这是运行是自定义异常1!");
}else if(3==number){
throw new NingException(202,"这是运行是自定义异常2!");
}else {
throw new NingException(NingExceptionEnum.userE);
}
}
}
4、查看结果
这是正常运行代码的结果
这是RuntimeException处理的结果
这是自定义异常处理类处理的结果
总结:
通过切面会减少很多重复的代码,开发时能更省力,更顺畅!