美文网首页
自定义valida验证注解

自定义valida验证注解

作者: 绵知了 | 来源:发表于2019-05-05 14:13 被阅读0次

    1. 自定义valida验证注解

    1.1 定义注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target({ ElementType.METHOD, ElementType.FIELD })  //注解作用域
    @Retention(RetentionPolicy.RUNTIME)  //注解作用时间
    @Constraint(validatedBy = MyConstriantValidator.class) //执行校验逻辑的类
    public @interface ConstraintDemo {
    
        // 验证不通过的消息 default 为默认值
        String message() default "valid fail message";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    }
    

    1.2 定义校验类

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class ConstraintDemoValidator implements ConstraintValidator<ConstraintDemo, Object> {
    
        /**
         * 初始化
         * 
         * @param constraintDemo
         */
        @Override
        public void initialize(ConstraintDemo constraintDemo) {
            System.out.println("my validator init");
        }
    
        /**
         * 真正的校验逻辑
         * 
         * @param value 传入过来的值
         */
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            // 校验的逻辑
            String validValue = String.valueOf(value);
            if (null == validValue) {
                return false;
            }
            return true;
        }
    }
    
    

    1.3 扩展,可在校验类中可定义service类

    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    public class ConstraintDemoValidator implements ConstraintValidator<ConstraintDemo, Object> {
    
        @Autowired
        private StudentService studentService;
    
        /**
         * 初始化
         * 
         * @param constraintDemo
         */
        @Override
        public void initialize(ConstraintDemo constraintDemo) {
            System.out.println("my validator init");
        }
    
        /**
         * 真正的校验逻辑
         * 
         * @param value 传入过来的值
         */
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            // 校验的逻辑,从service中调用方法,获得该stduent
            String validValue = String.valueOf(value);
            Student student = studentService.getStudent(validValue);
            if(null == student) {
                return false;
            }
            return true;
        }
    }
    

    1.4 使用

    public class Student {
        @ConstraintDemo(message = "username不能为null")
        protected String username;
    
        @RequestMapping("/test")
        @ResponseBody
        public MyResult testAnnotain(@Valid @RequestBody Student student, BindingResult result) {
            if (result.hasErrors()) {
                return MyResultExt.error(result);
            }
            return MyResult.OK();
        }
    

    2. 简单介绍

    @Retention :用来说明该注解类的生命周期。它有以下三个参数:
    RetentionPolicy.SOURCE : 注解只保留在源文件中,被编译器丢弃
    RetentionPolicy.CLASS : 注解保留在class文件中,在加载到JVM虚拟机时丢弃
    RetentionPolicy.RUNTIME : 注解保留在程序运行期间,此时可以通过反射获得定义在某个类上的所有注解。

    @Target : 用来说明该注解可以被声明在那些元素之前。
    ElementType.TYPE:说明该注解只能被声明在一个类前。
    ElementType.FIELD:说明该注解只能被声明在一个类的字段前。
    ElementType.METHOD:说明该注解只能被声明在一个类的方法前。
    ElementType.PARAMETER:说明该注解只能被声明在一个方法参数前。
    ElementType.CONSTRUCTOR:说明该注解只能声明在一个类的构造方法前。
    ElementType.LOCAL_VARIABLE:说明该注解只能声明在一个局部变量前。
    ElementType.ANNOTATION_TYPE:说明该注解只能声明在一个注解类型前。
    ElementType.PACKAGE:说明该注解只能声明在一个包名前。

    @Constraint来限定自定义注解的方法
    这里写的类是下面自定义的类

    3. 注解验证List集合类

    3.1 定义注解

    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    import javax.validation.Constraint;
    import javax.validation.Payload;
    
    @Target({ElementType.METHOD,ElementType.FIELD})  //注解作用域
    @Retention(RetentionPolicy.RUNTIME)  //注解作用时间
    @Constraint(validatedBy = LengthForCollectionStringValidator.class) //执行校验逻辑的类
    public @interface LengthForCollectionString {
     
        // 验证不通过的消息 default 为默认值
        String message() default "collection valid fail message";
    
        Class<?>[] groups() default {};
    
        Class<? extends Payload>[] payload() default {};
    
        // 最小长度, 默认0
        long minLength() default 0;
    
        // 最大长度
        long maxLength();
    
        // 正则表达式, 默认空
        String regexp() default "";
    
        // 是否必填,默认false
        boolean required() default false;
    }
    

    3.2 定义校验类

    import java.util.List;
    
    import javax.validation.ConstraintValidator;
    import javax.validation.ConstraintValidatorContext;
    
    import org.apache.commons.lang.StringUtils;
    
    import com.justsy.army.common.utils.CollectionUtils;
    
    public class LengthForCollectionStringValidator implements ConstraintValidator<LengthForCollectionString, Object> { // 两个泛型分别为自定义注解和要校验的类型
    
        private long minLength;
        private long maxLength;
        private String regexp;
        private boolean required;
    
        public long getMinLength() {
            return minLength;
        }
    
        public void setMinLength(long minLength) {
            this.minLength = minLength;
        }
    
        public long getMaxLength() {
            return maxLength;
        }
    
        public void setMaxLength(long maxLength) {
            this.maxLength = maxLength;
        }
    
        public String getRegexp() {
            return regexp;
        }
    
        public void setRegexp(String regexp) {
            this.regexp = regexp;
        }
    
        public boolean isRequired() {
            return required;
        }
    
        public void setRequired(boolean required) {
            this.required = required;
        }
    
        /**
         * 初始化
         * 
         * @param lengthForCollectionString
         */
        @Override
        public void initialize(LengthForCollectionString lengthForCollectionString) {
            setMinLength(lengthForCollectionString.minLength());
            setMaxLength(lengthForCollectionString.maxLength());
            setRegexp(lengthForCollectionString.regexp());
            setRequired(lengthForCollectionString.required());
            System.out.println("LengthForCollectionString init");
        }
    
        /**
         * 真正的校验逻辑
         * 
         * @param value 传入过来的值
         */
        @Override
        public boolean isValid(Object value, ConstraintValidatorContext context) {
            @SuppressWarnings("unchecked")
            List<String> valueList = (List<String>) value;
            if (CollectionUtils.isEmpty(valueList)) {
                return false;
            }
            for (String item : valueList) {
                if (item.length() < minLength || item.length() > maxLength) {
                    return false;
                }
                if (StringUtils.isNotEmpty(regexp)) {
                    if (!item.matches(regexp)) {
                        return false;
                    }
                }
                if (required) {
                    if (StringUtils.isBlank(item)) {
                        return false;
                    }
                }
            }
    
            return true;
        }
    }
    
    
    

    3.3 使用

    public class Student {
        @LengthForCollectionString(message = "手机号码不能为空且长度不能大于20个字符", minLength = 1, maxLength = 20, regexp = "^\\d{11,13}$")
        private List<String> phoneList;
    
        @RequestMapping("/test")
        @ResponseBody
        public MyResult testAnnotain(@Valid @RequestBody Student student, BindingResult result) {
            if (result.hasErrors()) {
                return MyResultExt.error(result);
            }
            return MyResult.OK();
        }
    

    4. 常用@Valid注解

    限制 说明
    @Null 限制只能为null
    @NotNull 限制必须不为null
    @AssertFalse 限制必须为false
    @AssertTrue 限制必须为true
    @DecimalMax(value) 限制必须为一个不大于指定值的数字
    @DecimalMin(value) 限制必须为一个不小于指定值的数字
    @Digits(integer,fraction) 限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction
    @Future 限制必须是一个将来的日期
    @Max(value) 限制必须为一个不大于指定值的数字
    @Min(value) 限制必须为一个不小于指定值的数字
    @Past 限制必须是一个过去的日期
    @Pattern(value) 限制必须符合指定的正则表达式
    @Size(max,min) 限制字符长度必须在min到max之间
    @Past 验证注解的元素值(日期类型)比当前时间早
    @NotEmpty 验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)
    @NotBlank 验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

    相关文章

      网友评论

          本文标题:自定义valida验证注解

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