Spring bean校验
public abstract class GenericValidator {
public abstract void validate(ProceedingJoinPoint pjp);
protected String errorHandler(Map<String,Object> errors) {
return new JSONObject(errors).toString();
}
}
public class BeanValidator extends GenericValidator{
private static final Logger logger = LoggerFactory.getLogger(BeanValidator.class);
private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
public void validate(ProceedingJoinPoint pjp) {
Object[] objs = pjp.getArgs();
for(int i = 0;i < objs.length;i++) {
validator(objs[i],new Class<?>[0]);
}
}
/**
* @Description: 验证器
* @param object 验证对象
* @param groups
*/
protected <T> void validator(T object, Class<?>... groups) {
Map<String,Object> errorMaps = new HashMap<String,Object>();
Set<ConstraintViolation<T>> constraintViolationSet = validator.validate(object, groups);
if(CollectionUtils.isNotEmpty(constraintViolationSet)) {
for(Iterator<ConstraintViolation<T>> iterator = constraintViolationSet.iterator(); iterator.hasNext();) {
ConstraintViolation<T> error = iterator.next();
errorMaps.put(((PathImpl)error.getPropertyPath()).getLeafNode().getName(), error.getMessage());
}
}
if(MapUtils.isNotEmpty(errorMaps)) {
logger.debug("【validator】:参数校验结果"+errorMaps);
throw new ParamException(errorHandler(errorMaps));
}
}
}
spring 方法级校验
public abstract class GenericValidator {
public abstract void validate(ProceedingJoinPoint pjp);
protected String errorHandler(Map<String,Object> errors) {
return new JSONObject(errors).toString();
}
}
public class ParamValidator extends GenericValidator{
private static final Logger logger = LoggerFactory.getLogger(ParamValidator.class);
private final ExecutableValidator executableValidator = Validation.buildDefaultValidatorFactory()
.getValidator().forExecutables();
public void validate(ProceedingJoinPoint pjp) {
Map<String,Object> errorMaps = new HashMap<String,Object>();
Object object = pjp.getTarget();// 目标对象
MethodSignature methodSignature = ((MethodSignature) pjp.getSignature());// 方法签名
Object[] parameterValues = pjp.getArgs();// 参数
Set<ConstraintViolation<Object>> constraintViolations = validator(object,
methodSignature.getMethod(),
parameterValues);
if(CollectionUtils.isNotEmpty(constraintViolations)) {
Iterator<ConstraintViolation<Object>> constraintViolationIterator = constraintViolations.iterator();
while(constraintViolationIterator.hasNext()) {
ConstraintViolation<Object> constraintViolation = constraintViolationIterator.next();
errorMaps.put(getMethodParamName(methodSignature, constraintViolation), constraintViolation.getMessage());
}
if(MapUtils.isNotEmpty(errorMaps)) {
logger.debug("【validator】:参数校验结果"+errorMaps);
throw new ParamException(errorHandler(errorMaps));
}
}
}
protected <T> Set<ConstraintViolation<T>> validator(T object,
Method method,
Object[] parameterValues,
Class<?>... groups) {
Set<ConstraintViolation<T>> set = executableValidator.validateParameters(object,
method,
parameterValues,
groups);
return set;
}
protected <T> Set<ConstraintViolation<T>> validator(T object,
Method method,
Object[] parameterValues) {
return validator(object, method, parameterValues, new Class<?>[0]);
}
/**
* 获得方法参数名称
* @param methodSignature
* @param constraintViolation
* @return
*/
private static String getMethodParamName(MethodSignature methodSignature,
ConstraintViolation<Object> constraintViolation) {
String[] parameterNames = methodSignature.getParameterNames();
PathImpl pathImpl = (PathImpl) constraintViolation.getPropertyPath(); // 获得校验的参数路径信息
int paramIndex = pathImpl.getLeafNode().getParameterIndex(); // 获得校验的参数位置
if(parameterNames == null || parameterNames.length == 0 || parameterNames.length <= paramIndex) {
return "";
} else {
return parameterNames[paramIndex];
}
}
}
框架整合
利用aop对方法进行拦截
@Component
@Aspect
public class ParamValidAspect {
/*验证com.gz.controller及其子包中以update开头和insert开头的方法*/
/*验证com.gz.controller及其子包中以BeanValid结尾的方法*/
@Pointcut("execution(* com.gz.controller..*.insert* (..)) || execution(* com.gz.controller..*.update* (..)) || execution(* com.gz.controller..*.*BeanValid(..))")
public void beanValidatorPointcut(){}
/*验证com.gz.controller及其子包中以ParamValid结尾的方法*/
@Pointcut("execution(* com.gz.controller..*.*ParamValid(..))")
public void paramValidatorPointcut(){}
@Around("beanValidatorPointcut()")
public ResponseRel beanValidatorAdvice(ProceedingJoinPoint pjp) throws Throwable {
GenericValidator validator = new BeanValidator();
validator.validate(pjp);
Object[] args = pjp.getArgs();
Object result = pjp.proceed(args);
return (ResponseRel)result;
}
@Around("paramValidatorPointcut()")
public ResponseRel paramValidatorPointcut(ProceedingJoinPoint pjp) throws Throwable {
GenericValidator validator = new ParamValidator();
validator.validate(pjp);
Object[] args = pjp.getArgs();
Object result = pjp.proceed(args);
return (ResponseRel)result;
}
}