@Aspect
@Component
@Slf4jpublic classRequestHelperAspect {
@AutowiredprivateSmartValidator validator;
@Around("@annotation(restRequestHelper)")publicObject process(ProceedingJoinPoint pjp, RestRequestHelper restRequestHelper) {
Class> targetClass =pjp.getTarget().getClass();
String className=targetClass.getSimpleName();
String methodName=pjp.getSignature().getName();
Object[] args=pjp.getArgs();
Object[] arguments= newObject[args.length];for (int i = 0; i < args.length; i++) {if (args[i] instanceof ServletRequest || args[i] instanceof ServletResponse || args[i] instanceofMultipartFile) {//ServletRequest不能序列化,从入参里排除,否则报异常:java.lang.IllegalStateException: It is illegal to call this method if the current request is not in asynchronous mode (i.e. isAsyncStarted() returns false)//ServletResponse不能序列化 从入参里排除,否则报异常:java.lang.IllegalStateException: getOutputStream() has already been called for this response
continue;
}
arguments[i]=args[i];
}
log.info("processing request:{}.{} begin,params:{}", className, methodName, arguments);long startTime =System.currentTimeMillis();
Object proceed= null;if ((proceed = validParams(arguments,restRequestHelper.validGroups())) == null) {try{
proceed=pjp.proceed();
}catch(Throwable throwable) {
log.error("processing request error:", throwable);
//异常处理}
}long endTime =System.currentTimeMillis();//响应参数toString
String response = null;if (proceed instanceofResult) {
Result result=(Result) proceed;
response=result.toJson();
}else if (proceed!=null){
response=proceed.toString();
}
log.info("processing request:{}.{} end,params:{},response:{},use:{}ms", className, methodName, arguments, response, endTime -startTime);returnproceed;
}/*** 参数校验
*
*@paramargs
*@paramclasses
*@return
*/
privateResult validParams(Object[] args, Class[] classes) {
Result errorResult= null;for(Object arg : args) {if(arg==null){continue;
}
BindingResult bindingResult= newBeanPropertyBindingResult(arg, arg.getClass().getSimpleName());if(classes.length>0){
validator.validate(arg, bindingResult,classes);
}else{
validator.validate(arg, bindingResult);
}
StringBuilder errorMsg= null;
Map errorMap = null;if(bindingResult.hasErrors()) {
errorMsg= newStringBuilder();
errorMsg.append(//异常信息);final List fieldErrors =bindingResult.getFieldErrors();
errorMap= new HashMap<>(fieldErrors.size());for(FieldError fieldError : fieldErrors) {
errorMap.put(fieldError.getField(), fieldError.getDefaultMessage());
}
errorMsg.append(JSON.toJSON(errorMap));
errorResult= newResult(...异常);
}
}returnerrorResult;
}
}