spring aop+注解拦截service层异常,并将错误发送、抄送指定邮箱
原创    java_world    发表于:2018-07-13 09:36:20
  阅读 :24   收藏   编辑

maven添加aspect相关依赖

<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjrt</artifactId>
	<version>1.8.9</version>
</dependency>
<dependency>
	<groupId>org.aspectj</groupId>
	<artifactId>aspectjweaver</artifactId>
	<version>1.8.9</version>
</dependency>

spring context.xml添加自动代理

<aop:aspectj-autoproxy proxy-target-class="true"/>

定义注解ServiceErrorAnnotation

package com.faceghost.app.annotation;

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

/**
 * 自定义注解 拦截service异常信息
 * @author faceghost.com/profile/java_world
 *
 */
@Target({ElementType.PARAMETER,ElementType.METHOD})//使用于方法参数,及方法上
@Retention(RetentionPolicy.RUNTIME)//会在class字节码文件中存在,在运行时可以通过反射获取到
@Documented  //将被包含在javadoc中
public @interface ServiceErrorAnnotation {

	/**
	 * 描述
	 */
	String desc();
	
	/**
	 * 是否发送邮件
	 */
	boolean isSendEmail();
	
	/**
	 * 邮件收件人
	 * @return
	 */
	String sendTo() default "";
	
	/**
	 * 邮件抄送人
	 * @return
	 */
	String sendCc() default "";
	
	
}

servcie 注解异常切面

package com.faceghost.app.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import com.faceghost.app.annotation.ServiceErrorAnnotation;
import com.faceghost.app.utils.ExceptionUtil;
/**
 * servcie 注解异常切面
 * 
 * @author faceghost.com/profile/java_world
 */
@Scope
@Aspect
@Component
public class ServiceErrorAop {

	private static final Logger log = Logger.getLogger(ServiceErrorAop.class);
		
	@AfterThrowing(value="@annotation(sea)",throwing="e")
	public void doAfterThrowing(JoinPoint joinPoint,ServiceErrorAnnotation sea,Throwable e)  throws Exception{
			// 获得目标方法名
			String method = joinPoint.getSignature().getDeclaringTypeName() + joinPoint.getSignature().getName();
		
			/**
			 * 忽略某些异常
			 * if (e instanceof xxxException) {
				return;
			}*/
			
			/**
			 * 获取参数值
			 */
			StringBuffer params = new StringBuffer();
			if (joinPoint.getArgs() != null) {
				int len = joinPoint.getArgs().length;
				for (int i = 0; i < len; i++) {
					params.append(joinPoint.getArgs()[i]);
					if(i != len - 1) {
						params.append(",");
					}
				}
			}
			
			/**
			 * 描述
			 */
			String desc = sea.desc();
			
			log.info(String.format("%s方法抛出异常,描述:%s", method,desc));
			log.info(String.format("%s方法抛出异常,参数值:%s", method,params.toString()));
			log.info(String.format("%s方法抛出异常,异常:%s", method,ExceptionUtil.getExDetail(e)));
			
			/**
			 * 是否发送邮件
			 */
			if(sea.isSendEmail()) {
				String sendTo = sea.sendTo();
				String sendCc = sea.sendCc();
				log.info(String.format("%s方法抛出异常,发送邮件,收件人:%s,抄送:%s", method,sendTo,sendCc));
				
				/**
				 * 调用发送邮件
				 */
			}
			
	}
}

使用

在service层方法上添加相关注解,出现异常将会执行aop中的doAfterThrowing

@ServiceErrorAnnotation(desc="根据ID删除Test",isSendEmail=true,sendTo="test@test.com",sendCc="test1@test.com;test2@test.com")

获取源码

https://github.com/FaceGhost/Simple-SSM

评论
条评论