Hibernate Validator 4.1+ 提供了一个自定义的纯字符串 @NotBlank 注释,用于在修剪空格后检查非空和非空。 @NotBlank 的 api 文档状态:
与 NotEmpty 的区别在于尾随空格会被忽略。
如果不清楚@NotEmpty是在检查前对String进行修整,先看4.1文档中'built-in constaints'表下给出的描述:
检查带注释的字符串不为空且修剪后的长度大于0。与@NotEmpty 的不同之处在于该约束只能应用于字符串,并且忽略尾随空格。
然后,浏览代码,你会看到@NotBlank 是defined as:
@Documented
@Constraint(validatedBy=NotBlankValidator.class)
@Target(value={METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PARAMETER})
@Retention(value=RUNTIME)
@NotNull
public @interface NotBlank{
/* ommited */
}
在这个定义中有两点需要注意。首先是@NotBlank的定义包含@NotNull,所以是@NotNull的扩展。第二个是它通过使用带有 NotBlankValidator.class 的@Constraint 扩展@NotNull。这个类有一个isValid 方法,它是:
public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
if ( charSequence == null ) { //this is curious
return true;
}
return charSequence.toString().trim().length() > 0; //dat trim
}
有趣的是,如果字符串为 null,则此方法返回 true,但当且仅当修剪字符串的长度为 0 时返回 false。如果它为 null,则返回 true 是可以的,因为正如我所提到的,@NotEmpty 定义也需要@NotNull。