自定义枚举校验注解

碰到一个需要校验前端参数是否属于某个枚举值的场景,所以自定义了一个枚举注解。
下面的demo是从其他博客copy的,仅供自用。
前提: javax.validation包是提供了方便的自定义校验的入口的,就是javax.validation.ConstraintValidator

步骤:

1.定义一个注解,在@Constraint(validatedBy = OrderTypeValidator.class)里指定遇到注解时的处理逻辑,即处理逻辑写在被validatedBy 指定的类中。
2.把注解逻辑类写了
3.使用注解

注解接口

@Documented
@Constraint(validatedBy = {})
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
@Retention(RUNTIME)
public @interface EnumValidateAnnotation {

    /**
     * 校验报错信息
     *
     * @return
     */
    String message() default "";

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

    /**
     * 附件 用于扩展
     *
     * @return
     */
    Class<? extends Payload>[] payload() default {};

    /**
     * 允许的枚举值,所有类型转成String 存储
     * @return
     */
    String[] enums() default {};

}

校验器(要实现ConstraintValidator接口,第一个泛型写注解类比如TsCheck,第二个泛型写要校验的值的类型)

public class EnumStringValidator implements ConstraintValidator<EnumValidateAnnotation,String> {

    private List<String> enumStrings;

    @Override
    public void initialize(EnumValidateAnnotation constraintAnnotation) {
        enumStrings = Lists.newArrayList(constraintAnnotation.enums());
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }
        // 对于Integer,将其转化为String 后比较
        return enumStrings.contains(value);
    }
}


使用

/**
     * 来源
     * {@link FromEnum}
     */
    @NotNull(message = "请求来源不能为空")
	// 这里将枚举值FromEnum的String表示放入注解的enums中
	// 如果是离散值的话,更加合适,因为不用关心枚举值和注解 enums保持一致
    @EnumValidateAnnotation(enums = {
    "from1", "from2"}, message = "上报来源错误")
    String from;

你可能感兴趣的:(杂七杂八,java)