一尘不染

在Hibernate Validator 4.1+中,@ NotNull,@ NotEmpty和@NotBlank有什么区别?

hibernate

我似乎找不到能够区分这三个注释之间区别的摘要。


阅读 447

收藏
2020-06-20

共1个答案

一尘不染

@NotNull:CharSequence,Collection,Map或Array对象 不为null ,但 可以 为空。
@NotEmpty:CharSequence,Collection,Map或Array对象不为null, 并且size > 0
@NotBlank:字符串不为null ,并且修剪后的长度大于零

为了帮助您理解,让我们研究一下如何定义和执行这些约束(我使用的是4.1版):

  1. @NotNull约束被定义为:
    @Constraint(validatedBy = {NotNullValidator.class})
    

此类的isValid方法定义为:

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
 return object != null;  
}
  1. @NotEmpty约束被定义为:
    @NotNull
    

    @Size(min = 1)

因此,此约束 使用@NotNull上面的约束, 并且 @Size其定义因对象而异,但应该是自说明的。

  1. 最后,@NotBlank约束定义为:
    @NotNull
    

    @Constraint(validatedBy = {NotBlankValidator.class})

因此,此约束还使用了@NotNull约束,但也约束了NotBlankValidator类。此类的isValid方法定义为:

    if ( charSequence == null ) {  //curious 
  return true;   
}   
return charSequence.toString().trim().length() > 0;

有趣的是,如果字符串为null,则此方法返回true,但仅当修剪后的字符串的长度为0时,此方法才返回false。如果为null,则返回true是可以的,因为正如我提到的,@NotEmpty定义也需要@NotNull

这里有一些例子:

  1. 字符串名称= null;
    @NotNull:错误
    @NotEmpty:错误
    @NotBlank:错误

  2. 字符串名称=“”;
    @NotNull
    @NotEmpty:假
    @NotBlank:假

  3. 字符串名称=“”;
    @NotNulltrue
    @NotEmptytrue
    @NotBlank:false

  4. 字符串名称=“好答案!”;
    @NotNulltrue
    @NotEmptytrue
    @NotBlanktrue

2020-06-20