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

我似乎无法find一个区分这三个注释区别的总结。

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

为了帮助您理解,我们来看看如何定义和执行这些约束条件(我正在使用4.1版本):

  1. @NotNull约束被定义为:

     @Constraint(validatedBy = {NotNullValidator.class}) 

    这个类有一个isValid方法定义如下:

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

     @NotNull @Size(min = 1) 

    所以这个约束使用上面的@NotNull约束, @Size的定义根据对象的不同而不同,但应该是自我解释的。

  3. 最后, @NotBlank约束被定义为:

     @NotNull @Constraint(validatedBy = {NotBlankValidator.class}) 

    所以这个约束也使用了@NotNull约束,但是也限制了NotBlankValidator类。 这个类有一个isValid方法定义如下:

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

    有趣的是,如果string为空,则此方法返回true,但当且仅当修剪的string的长度为0时返回true。如果为空,则返回true,因为如我所提到的, @NotEmpty定义也要求@NotNull

这里有一些例子:

  1. String name = null;
    @NotNull :false
    @NotEmpty :false
    @NotBlank :false

  2. String name =“”;
    @NotNull真的
    @NotEmpty :false
    @NotBlank :false

  3. String name =“”;
    @NotNull真的
    @NotEmptytrue
    @NotBlank :false

  4. string名称=“好的答案!”;
    @NotNull真的
    @NotEmptytrue
    @NotBlank真的

我喜欢在下面的链接的解释: http : //www.itprogrammingtutorials.com/2015/java/hibernate/hibernate-validator-diff-notblank-notempty/

@NotNull:检查值是否不为空,忽略内容

@NotEmpty:检查值是否为空也不为空。 如果它只有空的空间,它将允许它不是空的。

@NotBlank:检查值是否不为空也不为空,首先修改值。 这意味着,它不会允许只是空的空间。

所以,如果你想validation一个字段不为空,而且它不只是空白,而是文本,你应该使用@NotBlank。