使⽤注解实现⼊参参数校验(springboot+AOP)的⼀种实现⽅式
使⽤注解实现⼊参参数校验
⼯作场景中,参数校验必不可少,最近利⽤⾃定义注解实现⼊参参数校验,在⼊参校验⽅⾯,有不错的扩展性,可重⽤性。
效果
接⼝调⽤,如果⼊参是实体类,就在实体类的变量上⽅标记。
实体类例⼦
返回结果
实现
先⾃定义⼀个注解,⽤来标记需要校验的参数。
@Target({ElementType.METHOD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE, ElementType.CONSTRUCTOR, ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME)
public@interface Examine {
String value()default"isNull";
}
利⽤注解的标记,定义⼀个aop,实现对参数的获取和校验
@Component
@Aspect
public class ExamineAop {
@Around("@annotation(examine)")
public Object paramCheck(ProceedingJoinPoint joinPoint, Examine examine)throws Throwable {
//获取⽅法传⼊参数数组
Object[] args = Args();
MethodSignature signature =(MethodSignature) Signature();
Parameter[] parameters = Method().getParameters();
//循环数组
for(int i =0; i < parameters.length; i++){
isnull的用法
Parameter parameter = parameters[i];
/
/处理类似String Integer的类
if(Type())){
//获取参数上是否带有⾃定义注解,不为空则代表有
Examine annotation = Annotation(Examine.class);
if(annotation ==null){
continue;
}
//判断传⼊参数是否为null
if(args[i]==null){
if(args[i]==null){
//抛出⾃定义异常,会被我的全局异常处理捕获,返回固定的返回体
throw new ExamineException();
}
//利⽤反射,调⽤⾃定义注解中的参数⽅法
Method verificationUtil = Method(annotation.value(), Object.class);
Object invoke = verificationUtil.invoke(null, args[i]);
if(invoke.equals(false)){
throw new ExamineException();
}
continue;
}
//处理⾃定义实体类中带有⾃定义注解的成员变量,验证⽅法相同
Class<?> paramClazz = Type();
Object arg = Arrays.stream(args).filter(ar -> paramClazz.Class())).findFirst().get();
Field[] declaredFields = DeclaredFields();
for(Field field : declaredFields){
field.setAccessible(true);
Examine annotation = Annotation(Examine.class);
if(annotation ==null){
continue;
}
if(args[i]==null){
throw new ExamineException();
}
Method verificationUtil = Method(annotation.value(), Object.class);
Object invoke = verificationUtil.invoke(null, (arg));
if(invoke.equals(false)){
throw new ExamineException();
}
continue;
}
}
return joinPoint.proceed();
}
/
**
* 判断是否为基本类型:包括String
*
* @param clazz clazz
* @return true:是; false:不是
*/
private boolean isPrimite(Class<?> clazz){
return clazz.isPrimitive()|| clazz == String.class;
}
}
验证⼯具类,在aop实现类中利⽤反射调⽤,在本类中可以添加⾃⼰的验证,在注解中,传⼊⽅法名字,即可调⽤⽅法来验证参数,如(Examine(isPhone)String phone)。
public class VerificationUtil {
/**
* 验证是否⼿机号
*
* @param phone
* @return
*/
public static Boolean isPhone(Object phone){
String pattern ="^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\\d{8})?$";
String().matches(pattern);
}
/
**
* 验证是否为空
*
* @param value
* @return
*/
public static Boolean isNull(Object value){
return value !=null|| String.valueOf(value).length()>0;
}
}
结尾
在本程序中还有异常类和全局捕获异常没有写出,百度⼀⼤堆。
如有错误和bug,欢迎指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。