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;
}
}