package cn.timer.api.aspect; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.BindingResult; import org.springframework.validation.ObjectError; import com.alibaba.fastjson.JSONObject; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.lang.Console; import cn.hutool.core.util.ClassUtil; import cn.hutool.core.util.ObjectUtil; import cn.timer.api.aspect.lang.annotation.BindingResultCtrol; import cn.timer.api.aspect.lang.bean.ValidationError; import cn.timer.api.utils.ResultUtil; /** * 校验信息返回 * * @author TZQ */ @Aspect @Component public class BindingResultAspect { // @annotation配置织入点 @Pointcut("@annotation(cn.timer.api.aspect.lang.annotation.BindingResultCtrol)") public void bindingResultPointCut() { } // execution 配置织入点 @Pointcut("execution(* cn.timer.api.controller.*.*.*(..))") public void clazzPointCut() { } // @Before("bindingResultPointCut()") public void doBefore(JoinPoint point) throws Throwable { //预留 // handleDataScope(point); } // @Around("bindingResultPointCut() && args(..,bindingResult)") @Around("clazzPointCut()") public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { Long startTime = System.currentTimeMillis(); Object retVal; Object[] objs = joinPoint.getArgs(); List<Object> listObj = CollectionUtil.toList(objs); BeanPropertyBindingResult optional = (BeanPropertyBindingResult)listObj.stream() .filter(p -> "BeanPropertyBindingResult".equals(ClassUtil.getClassName(p, true))) .findFirst() .orElse(null); if(optional != null && optional.hasErrors()){ List<ObjectError> ls = optional.getAllErrors(); List<ValidationError> listVe = new ArrayList<ValidationError>(); ValidationError ve; for (ObjectError one : ls) { String fieldString = one.getCodes().length >= 1 ? one.getCodes()[0] : ""; if (fieldString != null) { fieldString = fieldString.substring(fieldString.lastIndexOf(".") + 1); } for (String str : one.getCodes()) { System.err.println(str); } ve = ValidationError.builder().field(fieldString).msg(one.getDefaultMessage()).build(); listVe.add(ve); } retVal = ResultUtil.error(listVe); }else { retVal = joinPoint.proceed(joinPoint.getArgs()); } Console.log("返回内容 {}: " ,JSONObject.toJSONString(retVal)); Long endtime = System.currentTimeMillis(); Console.log("执行耗时为{}:" ,endtime-startTime + "ms"); // Object[] objs = joinPoint.getArgs(); // // List<Object> listObj = CollectionUtil.toList(objs); // BeanPropertyBindingResult optional = (BeanPropertyBindingResult)listObj.stream() // .filter(p -> "BeanPropertyBindingResult".equals(ClassUtil.getClassName(p, true))) // .findFirst() // .orElse(null); // if (optional != null && optional.hasErrors()) { // System.err.println("Optional: "+ optional); // } return retVal; } protected void handleDataScope(final JoinPoint joinPoint) { // 获得注解 BindingResultCtrol controllerDataScope = getAnnotationLog(joinPoint); if (controllerDataScope == null) return; Console.log("title" + controllerDataScope.title()); Console.log("paramType" + controllerDataScope.paramType()); Object[] objs = joinPoint.getArgs(); List<Object> listObj = CollectionUtil.toList(objs); BeanPropertyBindingResult optional = (BeanPropertyBindingResult)listObj.stream() .filter(p -> "BeanPropertyBindingResult".equals(ClassUtil.getClassName(p, true))) .findFirst() .orElse(null); if (optional != null && optional.hasErrors()) { System.err.println("Optional: "+ optional); } } /** * 是否存在注解,如果存在就获取 */ private BindingResultCtrol getAnnotationLog(JoinPoint joinPoint) { Signature signature = joinPoint.getSignature(); MethodSignature methodSignature = (MethodSignature) signature; Method method = methodSignature.getMethod(); if (method != null) { return method.getAnnotation(BindingResultCtrol.class); } return null; } }