自定义valida验证注解

2019-05-05  本文已影响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只应用于字符串且在比较时会去除字符串的空格
上一篇 下一篇

猜你喜欢

热点阅读