aop拦截所有的请求并处理异常



package cn.gilight.dms.interceptor;

import cn.gilight.dms.base.ResultMessage;
import cn.gilight.dms.base.ResultType;
import cn.gilight.dms.util.SpringUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import org.springframework.web.context.request.RequestContextHolder;

/**

* @program: ExceptionAspectController

* @description: aop捕获程序内运行异常,并强制规定返回类型为resultMessage(如果和4

04异常处理.note结合可以不要)

* @author: douxiaoliang

* @create: 2019-07-30 15:22

* @Version V1.0

**/

@Component

@Aspect

public class ExceptionAspect {
    public static final Logger logger =

LoggerFactory.getLogger(ExceptionAspect.class);

/***

* @Description: 定义一个切入点.

* @Param[]: []

* @return: void

* @Author: douxiaoliang

* @Date: 2019/7/30

*/

@Pointcut(“execution(* cn.gilight.dms.controller..*.*(..))”)//此处基于自身

项目的路径做具体的设置

    public void pointCut(){}

@Around(“pointCut()”)

    public Object handleControllerMethod(ProceedingJoinPoint pjp) {

ServletRequestAttributes attributes =

(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();

HttpServletRequest request =attributes.getRequest();

StopWatch stopwatch = new StopWatch();

ResultMessage<?> resultMessage=null;

try {

logger.info(“执行Controller开始: " + pjp.getSignature() + " 参数:”

+ new ArrayList(Arrays.asList(pjp.getArgs())).toString());

resultMessage = (ResultMessage<?>) pjp.proceed(pjp.getArgs());

logger.info(“执行Controller结束: " + pjp.getSignature() + “, 返回

值:” + resultMessage.toString());

logger.info(“耗时:” + stopwatch.getTotalTimeMillis());

} catch (Throwable throwable) {

resultMessage =handlerException(pjp, throwable);

        }

resultMessage.setApi(request.getRequestURI());

resultMessage.setMethod(request.getMethod());

return resultMessage;

    }
    private ResultMessage<?> handlerException(ProceedingJoinPoint pjp, Throwable

e) {

ResultMessage<?> resultMessage = null;

if(e.getClass().isAssignableFrom(ResultException.class) ){

//logger.error(“ResultException{方法:” + pjp.getSignature() + “, 参

数:” + pjp.getArgs() + “,异常:” + e.getMessage() + “}”, e);

resultMessage = new

ResultMessage(ResultType.ERROR.getStatus(),ResultType.ERROR.getMessage());

} else if (e instanceof RuntimeException) {

logger.error(“RuntimeException{方法:” + pjp.getSignature() + “, 参

数:” + pjp.getArgs() + “,异常:” + e.getMessage() + “}”, e);

resultMessage = new

ResultMessage(ResultType.ERROR.getStatus(),e.getMessage());

} else {

logger.error(“异常{方法:” + pjp.getSignature() + “, 参数:” +

pjp.getArgs() + “,异常:” + e.getMessage() + “}”, e);

resultMessage = new

ResultMessage(ResultType.UNKNOW_ERROR.getStatus(),ResultType.UNKNOW_ERROR.getMes

sage());

        }

return resultMessage;

    }
}

package cn.gilight.dms.base;

import lombok.Data;

import java.io.Serializable;

/**

* @program: RequestResult

* @description: 统一返回结果对象

* @author: douxiaoliang

* @create: 2019-07-30 10:24

* @Version V1.0

**/

@Data

//@JsonSerialize(include= JsonSerialize.Inclusion.NON_NULL)

public class ResultMessage<T> implements Serializable {

//接口地址

    private String api;

//接口方法

    private String method;

//状态码

    private Integer status;

//状态码信息

    private String message;

//返回结果

    private T data;

    public ResultMessage() {
    }

    public ResultMessage(Integer status, String message) {

this.status = status;

this.message = message;

    }
    public ResultMessage(String api, String method, Integer status, String

message, T data) {

this.api = api;

this.method = method;

this.status = status;

this.message = message;

this.data = data;

    }
}

package cn.gilight.dms.interceptor;

import cn.gilight.dms.base.ResultMessage;

/**

* @program: ResultException

* @description: 接口返回异常处理类

* @author: douxiaoliang

* @create: 2019-07-30 11:29

* @Version V1.0

**/

public class ResultException extends RuntimeException {

    private String code;
    private String msg;

    public ResultException(String code,String msg){

this.code = code;

this.msg = msg;

    }

    public String getCode() {

return code;

    }

    public void setCode(String code) {

this.code = code;

    }

    public String getMsg() {

return msg;

    }

    public void setMsg(String msg) {

this.msg = msg;

    }
}