package com.yach.asp;
import com.yuejian.dao.Y_ExceptionDao;
import com.yuejian.pojo.RtnResult;
import com.yuejian.pojo.Y_Exception;
import com.yuejian.util.DateUtil;
import com.yuejian.util.WebUtils;
import org.apache.commons.lang.time.StopWatch;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.ThrowsAdvice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* 异常统一处理
* Created by Yach on 2019/7/19
*/
@Aspect
@Component
public class ExceptionInterceptor implements ThrowsAdvice {
private static final Logger logger = LoggerFactory.getLogger(ExceptionInterceptor.class);
@Autowired
Y_ExceptionDao y_exceptionDao;
/**
* 定义命名的切点:所有控制层@Controller标注类的 public方法 该方法仅供@Pointcut注解依附
*/
@Pointcut("execution(* com.yach.controller.*.*(..))")
public void pointcut() { }
/**
* 环绕通知 @Around 处理切面
* @return Object
*/
@Around("pointcut()")
public Object handleControllerMethod(ProceedingJoinPoint pjp) {
// org.apache.commons.lang3.time.StopWatch 计时器
StopWatch stopwatch = new StopWatch();
Object obj = null;
try {
stopwatch.start();
// 必须调用proceed()方法,否则会阻塞被通知方法的调用
obj = pjp.proceed();
stopwatch.stop();
// 正常请求,日志暂不记录访问参数,以防参数包含敏感信息泄露
logger.info("执行方法:{},耗时:{}ms(毫秒)", pjp.getSignature(),
stopwatch.getTime());
} catch (Throwable throwable) {
obj = handleException(pjp, obj, throwable);
}
return obj;
}
/**
* 处理异常
*
*/
private RtnResult handleException(ProceedingJoinPoint pjp, Object result, Throwable e) {
// 为了兼容 Log4J暂未启用slf4j做日志门面 故日志打印写两个错误输出
// 若启用self4j可以直接使用
//log.error("Exception{方法2:{}, 参数:{},异常:{}}",pjp.getSignature(), pjp.getArgs(), e.getMessage(), e);
logger.error("Exception:{方法:{},参数:{}}", pjp.getSignature(), pjp.getArgs());
//记录日志时间
logger.error(DateUtil.format(new Date(),"yyyy-MM-dd HH:mm:ss"),e.getMessage(), e);
if (result instanceof RtnResult) {
return (RtnResult) result;
} else {
RtnResult rtnResult = new RtnResult();
rtnResult.setMessage("系统异常!");
// 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现
rtnResult.setCode(WebUtils.ERROR_STATUS);
rtnResult.setData(null);
rtnResult.setResult(WebUtils.ERROR_RESULT);
//异常入库
Y_Exception exception = new Y_Exception();
exception.setException(e.toString());
y_exceptionDao.insert(exception);
return rtnResult;
}
}
}
spring AOP统一处理异常日志输出,自定义异常返回值
于 2019-07-20 12:32:03 首次发布