问题复现
在Around方法中执行
point.proceed()
前后记录时间
然后你直接设置执行时间为
start-end
这时候你发现如果接口代码有异常产生,执行时间就为0了
问题原因
我的理解是当
point.proceed()
产生异常之后会直接进入
doAfterThrowing
所以导致你记录的时间为空
解决方案
在执行
point.proceed()
之前记录start时间,然后你在处理解析填充日志对象的时候设置end时间
比如一下
注意注释
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
//start
long beginTime = System.currentTimeMillis();
//TODO 日志对象setTime(beginTime)
Object result = point.proceed();
return result;
}
@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
//处理解析方法
handleLog(joinPoint, null, jsonResult);
}
@AfterThrowing(value = "logPointCut()", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, Exception e) {
//处理解析方法
handleLog(joinPoint, e, null);
}
/**
* 处理解析方法
* @param joinPoint
* @param e
* @param jsonResult
*/
protected void handleLog(final JoinPoint joinPoint, final Exception e, Object jsonResult) {
//TODO 日志对象.setTime(System.currentTimeMillis() - 日志对象.getTime)
//TODO save 数据库
}