天天看点

Hibernate Validator中特殊的null值

  如果入参值为

null

,注解通常不做校验。什么意思呢?举个栗子,你在一个Bean的

name

属性上加了

@Length

注解来校验名称长度:

@Length(min = 1, max = 10)
private String name;
           

  但是入参

name

传了

null

,那么Hibernate Validator的校验结果是通过校验,为什么呢?我们看下源码就知道了。(实现校验逻辑的源码在hibernate-validator jar包,org.hibernate.validator.internal.constraintvalidators文件夹内)我们找到类

SizeValidatorForCharSequence

@Override
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
    if ( charSequence == null ) {
        return true;
    }
    int length = charSequence.length();
    return length >= min && length <= max;
}
           

  从源码中,我们可以看到,当入参为

null

时,直接返回

true

了,也就是通过校验了。

  所以为了能把

null

也校验住,我们这里除了使用

@Length

注解,也还要配合使用

@NotNull

注解:

@NotNull
@Length(min = 1, max = 10)
private String name;
           

  这样,无论入参的

name

传的值是

null

或者不符合长度限制,就都不能通过校验了。

  当然,也还有一小部分注解,比如

@NotBlank

@NotEmpty

,会校验

null

值,入参为

null

校验是不会通过的。下面是

@NotEmpty

校验的源码:

@Override
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
    if ( charSequence == null ) {
        return false;
    }
    return charSequence.length() > 0;
}