自定义注解校验枚举入参

package com.migu.redstone.quanyi;

import org.apache.commons.lang.StringUtils;

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.Annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD})
@Constraint(validatedBy = EnumValid.EnumValidatorHandle.class)
public @interface EnumValid {

    String[] enums();

    Class[] sourceClass() default {};

    boolean isNull() default false;

    String message() default "入参值不在正确枚举中";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    class EnumValidatorHandle implements ConstraintValidator<EnumValid, Object>, Annotation {
        private List<String> enums = new ArrayList<String>();
        private boolean isNull = false;
        @Override
        public Class<? extends Annotation> annotationType() {
            return null;
        }

        @Override
        public void initialize(EnumValid constraintAnnotation) {
            this.isNull = constraintAnnotation.isNull();
            String[] enums = constraintAnnotation.enums();
            if (enums.length == 0) {
                Class<? extends IEnumSource>[] classes = constraintAnnotation.sourceClass();
                if (classes.length>0){
                    IEnumSource explicitInterface = SpringContextUtil.getBean(classes[0]);
                    this.enums = explicitInterface.source();
                }
            } else {
                this.enums = Arrays.asList(enums);
            }
        }

        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            if (value instanceof String) {
                return (isNull && StringUtils.isBlank((String) value))
                        || (StringUtils.isNotBlank((String) value) && enums.contains(value));
            } else {
                return (isNull && Objects.isNull(value))
                        || (Objects.nonNull(value) && enums.contains(value.toString()));
            }
        }
    }
    /**
     * 动态枚举实现该接口
     */
    public static interface IEnumSource {
        List<String> source();
    }
}

 

posted @ 2022-02-17 10:26  浪天涯&*  阅读(154)  评论(0编辑  收藏  举报