spring AOP统一处理异常日志输出,自定义异常返回值

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;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值