SpringBoot 自定义切面完成异常处理实现代码优化

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处理的结果

在这里插入图片描述

这是自定义异常处理类处理的结果
在这里插入图片描述

总结:

通过切面会减少很多重复的代码,开发时能更省力,更顺畅!

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值