java 切面 金额 校验,SpringMvc切面校验JavaBean及基础类型

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);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值