简单粗暴:SpringBoot实现自定义注解处理异常

应用场景:在有可能发生异常的方法上加上注解后,可将异常拦截后统一处理。

准备工作:完整的SpringBoot环境。

第一步:创建一个自定义注解类 DingDingLog.java

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DingDingLog {

    String token();

    String secret();

    String message() default "";

}

第二步:创建注册注解的类

import org.apache.commons.lang.StringUtils;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;


@Aspect
@Component
public class RegisterDingDingLog {
   
    @Pointcut("@annotation(com.api.constants.DingDingLog)")
    public void pointCut(){

    }

    @AfterThrowing(value = "pointCut()",throwing = "e")
    public void afterThrowing(JoinPoint point, Exception e){
        MethodSignature ms = (MethodSignature) point.getSignature();
        Method method = ms.getMethod();
        DingDingLog dingDingLog = method.getAnnotation(DingDingLog.class);
        //读取注解传的值
        String token = dingDingLog.token();
        String secret = dingDingLog.secret();
        String message = dingDingLog.message();
        //读取方法名称
        String name = method.getName();
        if(StringUtils.isNotBlank(message)){
            message+="\r\n";
        }
        message+=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) +"\r\n";
        message+="异常方法名:"+name;
        //在此处进行统一异常处理  如 发短信  发邮件  发钉钉 等
        //~~~~~~~~~~~~~~~~~~
    }
}

第三步:使用自定义注解

    @DingDingLog(message = "这是一个测试方法",token = "字符串",secret = "字符串")
    public void test(){
        int i = 0/0;
    }

结果如下:

当运行test()方法时,抛出异常后会执行RegisterDingDingLog 类中的afterThrowing方法。

如果test的异常被try-catch处理,则不会触发RegisterDingDingLog 类中的afterThrowing方法。

发布了9 篇原创文章 · 获赞 5 · 访问量 1904

猜你喜欢

转载自blog.csdn.net/q2450751976/article/details/104007528