枚举校验

自定义注解及校验实现

import lombok.extern.slf4j.Slf4j;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.Arrays;

/**
 * 自定义枚举验证注解
 */
@Target( {ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = EnumValidation.Validator.class)
@Documented
public @interface EnumValidation {

    /**
     * 错误提示信息
     *
     * @return
     */
    String message() default "Enumeration validation failed";

    /**
     * 校验分组
     *
     * @return
     */
    Class<?>[] groups() default {};

    /**
     * 要检验参数所属的枚举数组
     *
     * @return
     */
    Class<? extends EnumType>[] enums()  default {};

    int[] enumTypes() default {};


    /**
     * 要校验的参数是否可以为空
     *
     * @return
     */
    boolean require() default false;

    /** 默认配置 - 不加要报错 */
    Class<? extends Payload>[] payload() default {};

    // 验证器内部类
    @Slf4j
    class Validator implements ConstraintValidator<EnumValidation, Integer> {

        Class<? extends EnumType>[] enums;
        boolean require;
        int[] enumTypes;

        @Override
        public void initialize(EnumValidation constraintAnnotation) {
            this.enums = constraintAnnotation.enums();
            this.require = constraintAnnotation.require();
            this.enumTypes = constraintAnnotation.enumTypes();

        }

        @Override
        public boolean isValid(Integer value, ConstraintValidatorContext context) {
            //如果校验的字段为空,判断是否通过
            if ( value == null) {
                return require ? false:true;
            }

            if(enums != null && enums.length != 0){
                //校验枚举字段匹配
                for (Class<? extends EnumType> clazz : enums) {
                    if (clazz.isEnum()) {
                        EnumType[] enumConstants = clazz.getEnumConstants();
                        for (EnumType enumType : enumConstants) {
                            if (value == enumType.getCode()) {
                                return true;
                            }
                        }
                    }
                }
            }

            if(enumTypes != null && enumTypes.length != 0){
                return  Arrays.stream(enumTypes).anyMatch(et -> et == value);
            }
            return false;
        }
    }
}

用法

@EnumValidation(enums = PDEnum.taskType.class, require = true, message = "taskType盘点维度不存在")
@EnumValidation(enumTypes = {10,20}, require = true, message = "btsStatus不存在")
posted @ 2026-01-14 14:09  品书读茶  阅读(1)  评论(0)    收藏  举报