应用场景:在有可能发生异常的方法上加上注解后,可将异常拦截后统一处理。
准备工作:完整的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方法。