场景需求:需要根据入参的起止ip字符串,生成该范围内的所有ip地址。
前言:希望实现通用的参数校验功能,所有需要校验的接口参数都可以通过本方案完成校验。
一、自定义参数校验注解
/**
* description: 参数校验注解 <br>
* 使用注意:1、在需要校验的实体字段上标注该注解
* 2、若该实体外层嵌套了对象,应当在外层实体上同样标注该注解,并填写nestEntity=true
* 3、在需要校验的Controller方法上也标注该注解
* 校验逻辑详情参见 {@link EntityValidatorAspect}
*/
@Target({
ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Verify {
/** 参数名称 */
String name();
/** 参数最大长度 */
int maxLength() default Integer.MAX_VALUE;
/** 是否必填 这里只是判断是否为null */
boolean required() default true;
/** 是否为非空 是否为null和空串都判断 */
boolean notNull() default true;
/** 最小长度 */
int minLength() default Integer.MIN_VALUE;
/** 正则匹配 */
RegexOption regular() default RegexOption.DEFAULT;
/** 是否是嵌套对象 */
boolean nestEntity() default false;
}
二、通用参数校验切面
/**
* description: 参数校验切面类 <br>
*/
@Aspect
@Component
@Slf4j
public class EntityValidatorAspect {
/**
* 定义一个方法,用于声明切入表达式。
*/
@Pointcut("@annotation(com.test.dsp.annotation.Verify)")
public void validatorPointcut() {
}
@Before("validatorPointcut()")
public void parameterVerify(JoinPoint point) throws Exception {
//迭代所有参数
for (int i = 0; i < point.getArgs().length; i++) {
//切点对象
Object obj = point.getArgs()[i];
if (obj != null) {
validate(obj);
}
}
}
private void validate(Object