@Validated自定义条件注解

【背景】

  在做微信小程序对接的时候,我们常常会传入环境,譬如: 要打开的小程序版本。正式版为"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;
    }
}

使用方式:

猜你喜欢

转载自blog.csdn.net/weixin_38982591/article/details/129689210