【背景】
在做微信小程序对接的时候,我们常常会传入环境,譬如: 要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop",但是每次都要去写校验太麻烦了,我想直接用@Validated注解来做,但是里面提供的都不太合适,所以自己搞了一个自定义注解。
【实现】
/**
* @author yueF_L
* @date 2023-03-21 14:01
* 自定义条件注解
*/
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {ContainValueConstraintValidator.class})
public @interface ContainValue {
String message() default "数组不能为空";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
/**
* 自定义一个类型来存放数据(数组)
*
* @return
*/
String[] values() default {};
}
这里引用了类 #ContainValueConstraintValidator,实现比较逻辑。
package com.spark.common.core.validate.constraint;
import com.spark.common.core.validate.ContainValue;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;
/**
* @author yueF_L
* @date 2023-03-21 14:03
* 自定义条件注解实现方法
*/
public class ContainValueConstraintValidator implements ConstraintValidator<ContainValue, String> {
/**
* set存储
*/
private Set<String> set = new HashSet<>();
/**
* ContainValue拿到的是注解中的数据
*/
@Override
public void initialize(ContainValue constraintAnnotation) {
//拿到注解中自定义的数据,且是数组型的
String[] values = constraintAnnotation.values();
//放在数组里,遍历判断
for (String value : values) {
set.add(value);
}
}
@Override
public boolean isValid(String vStr, ConstraintValidatorContext constraintValidatorContext) {
if (set.contains(vStr)) {
return true;
}
return false;
}
}
使用方式: