美文网首页
实现自定义校验注解,ConstraintValidator接口

实现自定义校验注解,ConstraintValidator接口

作者: 白驹过隙_忽然而已 | 来源:发表于2019-08-07 14:45 被阅读0次

    一、Spring中的校验注解

    在spring的使用过程中,有一些现成的注解可以使用

    Constraint 详细信息
    @AssertFalse 该值必须为False
    @AssertTrue 该值必须为True
    @DecimalMax(value,inclusive) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值 ,inclusive表示是否包含该值
    @DecimalMin(value,inclusive) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值 ,inclusive表示是否包含该值
    @Digits 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Email 该值必须为邮箱格式
    @Future 被注释的元素必须是一个将来的日期
    @FutureOrPresent 被注释的元素必须是一个现在或将来的日期
    @Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
    @Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
    @Negative 该值必须小于0
    @NegativeOrZero 该值必须小于等于0
    @NotBlank 该值不为空字符串,例如“ ”
    @NotEmpty 该值不为空字符串
    @NotNull 该值不为Null
    @Null 该值必须为Null
    @Past 被注释的元素必须是一个过去的日期
    @PastOrPresent 被注释的元素必须是一个过去或现在的日期
    @Pattern(regexp) 匹配正则
    @Positive 该值必须大于0
    @PositiveOrZero 该值必须大于等于0
    @Size(min,max) 数组大小必须在[min,max]这个区间

    二、自定义注解

    @Target({ElementType.FIELD})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Constraint(
        validatedBy = {MobileNoValidator.class}
    )
    public @interface MobileNo {
        String message() default "手机号格式不正确";
    
        boolean nullable() default false;
    
        boolean blankable() default false;
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    该自定义注解类中用到了四种元注解,最后一个注解@Constraint表示校验此注解的校验器类,可以多个。值得一提的是除了自定义的message、nullable和blankable属性外,下面的groups和payload也是必须添加的。

    三、注解校验类

    public class MobileNoValidator implements ConstraintValidator<MobileNo, String> {
        private boolean nullable;
        private boolean blankable;
        private String message;
    
        public MobileNoValidator() {
        }
    
        @Override
        public void initialize(MobileNo constraintAnnotation) {
            this.nullable = constraintAnnotation.nullable();
            this.message = constraintAnnotation.message();
            this.blankable = constraintAnnotation.blankable();
        }
    
        @Override
        public boolean isValid(String value, ConstraintValidatorContext context) {
            if (value == null) {
                if (!this.nullable) {
                    //禁止默认消息返回
                    context.disableDefaultConstraintViolation();
                    //自定义返回消息
                    context.buildConstraintViolationWithTemplate("手机号不能为空").addConstraintViolation();
                    return false;
                } else {
                    return true;
                }
            } else if (value.length() == 0) {
                if (!this.blankable) {
                    context.disableDefaultConstraintViolation();
                    context.buildConstraintViolationWithTemplate("手机号不能为空白").addConstraintViolation();
                    return false;
                } else {
                    return true;
                }
            } else if (!AppUtils.isMobile(value)) {
                context.disableDefaultConstraintViolation();
                context.buildConstraintViolationWithTemplate((String)StringUtils.defaultIfBlank(this.message, "手机号格式不对")).addConstraintViolation();
                return false;
            } else {
                return true;
            }
        }
    }
    

    该接口使用了泛型,第一个参数是自定义注解类,第二个是要校验的数据类型
    重写的两个方法,initialize为初始化方法,可以在里面做一些初始化操作,isValid方法写我们自定义的校验逻辑

    相关文章

      网友评论

          本文标题:实现自定义校验注解,ConstraintValidator接口

          本文链接:https://www.haomeiwen.com/subject/eipodctx.html