validation注解

蔡晨
2023-12-01

常用注解

注解说明
@Null注解元素必须为null
@NotNull注解元素必须不为null
@NotBlank注解元素为字符串,并且被trim()以后length要大于0
@NotEmpty注解元素是否为Null或者Empty
@AssertTrue验证注解元素是否为 true
@AssertFalse验证注解元素是否为 false
@Size(min=, max=)注解元素(Array,Collection,Map,String)长度是否在给定的范围之内@Length(min=, max=)
@Max(value)注解的元素必须为数字,且小于等于最大值
@Min(value)注解的元素必须为数字,且大于等于最小值
@DecimalMax(value)注解元素必须是一个数字,且小于等于最大值
@DecimalMin(value)注解元素必须是一个数字,且大于等于最小值
@Digits(integer,fraction)注解元素必须是一个数字,且在可接受范围
@Past验证 Date 和 Calendar 对象是否在当前时间之前
@Future验证 Date 和 Calendar 对象是否在当前时间之后
@Pattern(regexp=正则表达式,flag=标志的模式)验证 String 对象是否符合正则表达式的规则
@Range(min=最小值, max=最大值)验证注解的元素值在最小值和最大值之间
@Email(regexp=正则表达式,flag=标志的模式)验证注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式
@Valid指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加@Valid注解即可级联验证

自定义校验

校验类

public class PhoneConstraintValidator implements ConstraintValidator<PhoneConstraint , Object> {
/**
     * 手机号校验
     */
    private final static Pattern CELL_PHONE_NUMBER = Pattern.compile("^1([35789][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$");

    /**
     * 国内固定电话校验
     */
    private final static Pattern FIXED_TELEPHONE_NUMBER = Pattern.compile("^([0-9]{3,4}-)?[0-9]{7,8}$");

    private final static Pattern PHONE_AND_TEL = Pattern.compile("^1([35789][0-9]|4[579]|66|7[0135678]|9[89])[0-9]{8}$|^([0-9]{3,4}-)?[0-9]{7,8}$");

    @Override
    public void initialize(PhoneConstraint constraintAnnotation) {
        System.out.println("PhoneConstraint initialize");
    }

   @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (StringUtils.isNotBlank(value)) {
            //手机号校验
            if (CELL_PHONE_NUMBER.matcher(value).matches()) {
                return true;
            } else if (PHONE_AND_TEL.matcher(value).matches()) {
                return true;
            }
            // 国内固定号码正则表达式
            return FIXED_TELEPHONE_NUMBER.matcher(value).matches();
        }
        return true;
    }
}
  • 自定义校验类,实现ConstraintValidator接口,initialize方法是校验器初始化执行,initialize()可以在验证开始前调用注解里的方法,从而获取到一些注解里的参数;isValid是校验逻辑,isValid()就是判断是否合法的地方,value是属性值,context校验上下文,里面包含校验注解里面的信息。
  • 类里面可以通过@Autowire注入spring管理的bean,Spring会将实现了ConstraintValidator接口的类成bean,所以这个类不需要加@Component

注解类

@Constraint是最关键的,它表示这个注解是一个验证注解,并且指定了一个实现验证逻辑的验证器。message()指明了验证失败后返回的消息,此方法为@Constraint要求。groups()和payload()也为@Constraint要求。

@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
/**
 * 指出当前约束是通过`PhoneConstraintValidator.class`来实现的
 */
@Constraint(validatedBy = PhoneConstraintValidator.class)
public @interface PhoneConstraint {

    /**
     * 配置message信息
     * @return
     */
    String message() default "请输入正确格式的手机号";

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

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

  • @Target注解,是专门用来限定某个自定义注解能够被应用在哪些Java元素上面的。它使用一个枚举类型定义,包括:TYPE、FIELD、METHOD、PARAMETER、CONSTRUCTOR、LOCAL_VARIABLE、ANNOTATION_TYPE等。
  • @Retention注解,用来修饰自定义注解的生命力。可以有RetentionPolicy.SOURCE(仅保存在源码中,会被编译器丢弃),RetentionPolicy.CLASS(在class文件中可用,会被VM丢弃)以及RetentionPolicy.RUNTIME(在运行期也被保留),这里选择了生命周期最长的RetentionPolicy.RUNTIME
 类似资料: