如果入参值为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;
}