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

应用场景:在有可能发生异常的方法上加上注解后,可将异常拦截后统一处理。随后可以向手机报警。如钉钉群、邮件、短信等。向钉钉群报警可参考 Java实现异常通知到手机钉钉

准备工作:完整的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方法。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值