不可取写法(正常在切面不要轻易去捕获异常,不然全局异常捕获不了):
@Component
@Aspect
public class MethodTimeAspect {
private Logger logger = LoggerFactory.getLogger(MethodTimeAspect.class);
@Around("execution(* com.zhongbao.controller.*Controller.*(..))")
public Object around(ProceedingJoinPoint point){
long start = System.currentTimeMillis();
Object result = null;
//try_catch直接捕获异常,做了处理,但是无法针对应到全局异常
try {
result = point.proceed();
} catch (Throwable throwable) {
logger.error("error=",throwable);
throwable.printStackTrace();
}
long time = System.currentTimeMillis()-start;
Class<?> clazz = point.getTarget().getClass();
String methodName = MethodSignature.class.cast(point.getSignature()).getMethod().getName();
logger.info("API method: "+clazz.getSimpleName()+"."+methodName+"(),cost-time:"+time+" ms");
return result;
}
}
可取写法(直接抛出,不做处理,将会被全局异常直接处理):
@Component
@Aspect
public class MethodTimeAspect {
private Logger logger = LoggerFactory.getLogger(MethodTimeAspect.class);
@Around("execution(* com.zhongbao.controller.*Controller.*(..))")
public Object around(ProceedingJoinPoint point) throws Throwable{
long start = System.currentTimeMillis();
Object result = null;
result = point.proceed();
long time = System.currentTimeMillis()-start;
Class<?> clazz = point.getTarget().getClass();
String methodName = MethodSignature.class.cast(point.getSignature()).getMethod().getName();
logger.info("API method: "+clazz.getSimpleName()+"."+methodName+"(),cost-time:"+time+" ms");
return result;
}
}
同时全局异常类需要打印日志,做到统一管理
/**
* 全局异常捕获并返回接口统一格式
* @param e
* @return
*/
@ExceptionHandler(value = GlobalException.class)
@ResponseBody
public ResponseData globalExceptionHandler(GlobalException e){
e.printStackTrace();
ResponseData responseData = new ResponseData();
responseData.setMessage(e.getMessage());
responseData.setCode(e.getCode());
responseData.setStatus(false);
responseData.setData(null);
return responseData;
}