package com.aspect;/*** Description:
*
* @Author: dab0
* Version: 1.0
* Create Date Time: 2019/5/20 10:29
* Update Date Time:
*@see
*/
importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Pointcut;importorg.aspectj.lang.reflect.MethodSignature;importorg.hibernate.validator.internal.engine.path.PathImpl;importorg.springframework.core.LocalVariableTableParameterNameDiscoverer;importorg.springframework.core.ParameterNameDiscoverer;importorg.springframework.stereotype.Component;importorg.springframework.validation.BeanPropertyBindingResult;importorg.springframework.validation.ObjectError;importjavax.validation.ConstraintViolation;importjavax.validation.Validation;importjavax.validation.ValidatorFactory;importjavax.validation.executable.ExecutableValidator;importjava.lang.reflect.Method;importjava.util.List;importjava.util.Set;/***@author: dab0
* @date:2019/5/20
* @package:com.aspect
**/@Component
@Aspectpublic classValidAspect {privateObjectError error;
@Pointcut("execution(public * com.controller.*.*(..))")public voidvalid() {
}/*** 环绕上面的valid方法切入的controller包下面的所有类方法
* 环绕通知,环绕增强,相当于MethodInterceptor
*@parampjp
*@return
*/@Around("valid()")public Object around(ProceedingJoinPoint pjp) throwsThrowable {
System.out.println("方法环绕start......");
Object[] objects=pjp.getArgs();
System.out.println("------arg objects:" +objects);if (objects.length <= 0) {returnpjp.proceed();
}//校验封装好的javabean//寻找带BindingResult参数的方法,然后判断是否有error,如果有则是校验不通过
for(Object object : objects) {if (object instanceofBeanPropertyBindingResult) {
BeanPropertyBindingResult result=(BeanPropertyBindingResult) object;if(result.hasErrors()) {
List errorList =result.getAllErrors();for(ObjectError objectError : errorList) {
System.out.println(objectError.getCode()+ ":" +objectError.getDefaultMessage());
}//返回第一条
return errorList.get(0).getDefaultMessage();
}
}
}//校验普通类型参数// //获得切入目标对象
Object target =pjp.getThis();//获得切入的方法
Method method =((MethodSignature) pjp.getSignature()).getMethod();//执行校验,获得校验结果
Set> validResult =validMethodParams(target, method, objects);//如果有校验不通过的
if (!validResult.isEmpty()) {//获得方法的参数名称
String[] parameterNames =parameterNameDiscoverer.getParameterNames(method);for (ConstraintViolationviolation : validResult) {//获得校验的参数路径信息
PathImpl pathImpl =(PathImpl) violation.getPropertyPath();if (pathImpl == null) {
System.out.println("------sorry pathImpl is null.");
}
System.out.println("------pathImpl:" +pathImpl.getLeafNode());//获得校验的参数位置
Integer paramIndex =pathImpl.getLeafNode().getParameterIndex();if (paramIndex == null) {
System.out.println("------sorry paramIndex is null.");
}//获得校验的参数名称
String paramName =parameterNames[paramIndex];
System.out.println("---------普通类型参数校验 参数名:" +paramName);
System.out.println("---------校验信息:" +violation.getMessage());
}//返回第一条
returnvalidResult.iterator().next().getMessage();
}return null;
}private ParameterNameDiscoverer parameterNameDiscoverer = newLocalVariableTableParameterNameDiscoverer();private final ValidatorFactory factory =Validation.buildDefaultValidatorFactory();private final ExecutableValidator validator =factory.getValidator().forExecutables();private Set>validMethodParams(T obj, Method method, Object[] params) {returnvalidator.validateParameters(obj, method, params);
}
}