当前位置: 首页 > 面试题库 >

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

温凯
2023-03-14
问题内容

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


问题答案:

@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



 类似资料:
  • 问题内容: 我在JSF托管bean中使用了Hibernate Validation批注。当我使用时,或者它们似乎没有以任何方式被触发。 视图: 这是怎么引起的,我该如何解决? 问题答案: 介绍 由于您未对使用的是哪个容器的问题发表评论,因此我在您的问题历史记录中进行了了解,以了解所有使用的容器。到目前为止,我只找到了Tomcat。因此,对于这个答案,我将假设您确实使用了我最初在发布评论时所猜测的T

  • 问题内容: 我只是想知道为什么我们通常在两个布尔之间使用逻辑OR 而不是按位OR ,尽管它们都运行良好。 我的意思是,请看以下内容: 我们可以代替使用吗?与和相同。 问题答案: 如果您使用和形式,而不是这些运算符的和形式,则Java不会费心地单独评估右手操作数。 这是您是否希望缩短评估时间的问题-在 大多数情况 下都是如此。 说明短路好处的一个好方法是考虑以下示例。 正如Jeremy和Peter提

  • 问题内容: 我在看一些模拟的OCJP问题。我遇到了一个非常令人困惑的语法。这里是: 为什么输出在和之间变化? 问题答案: 问题只是和您玩弄混乱的空格。 是通常的(不等于)比较。 另一方面: 最好写成如下形式: 因此,这是两个运算符。 首先反转。 然后将其分配回。 赋值运算符返回分配的值。因此,计算结果为true-这就是您要打印的内容。

  • 只需在Xpath中添加即可--它突出显示--各种页面元素----它表示什么? 下面是用于Gmail密码字段的XPaths。的意义是什么? >

  • 我对Angularjs很陌生。谁能解释一下这些AngularJS运算符之间的区别:用适当的例子隔离作用域。

  • 问题内容: 通过Firebug查找相对的XPath时: ---------如果我们一开始不使用点表示什么呢? 只需添加Xpath-它突出显示—各种页面元素----------这意味着什么? 以下是XPaths for Gmail密码字段。的意义是什么? 问题答案: 这些表达式都选择不同的节点集: .//*[@id=’Passwd’] “。” 在开始处表示当前处理 在当前节点处开始 。“ *”选择从