以下验证是不是意味着该字段不能为空? (@Size 注释)

Posted

技术标签:

【中文标题】以下验证是不是意味着该字段不能为空? (@Size 注释)【英文标题】:Does the following validation mean that the field cannot be null? ( @Size annotation )以下验证是否意味着该字段不能为空? (@Size 注释) 【发布时间】:2013-06-25 00:47:00 【问题描述】:

我的 Spring MVC 表单 bean 中有以下属性,使用 javax.validation.constraints 来验证表单 bean,如下所示:

public class MyForm 
    @Size(min = 2, max = 50)
    private String postcode;

    // getter and setter for postcode.

我的问题是:@Size(min = 2) 是否意味着该属性不能是null,因为它总是需要大于 2 的长度。我之所以这么说是因为在同一个约束中存在@NotNull包,因此如果我应该在上面的 bean 中使用它,这会使 @NotNull 约束变得多余。

【问题讨论】:

“空值被认为是有效的”在docs.oracle.com/javaee/6/api/javax/validation/constraints/…中说 【参考方案1】:

如果您查看注释的文档 Size (http://docs.oracle.com/javaee/6/api/javax/validation/constraints/Size.html) 您可以阅读“null 元素被认为是有效的。” 因此,您需要在字段顶部指定 @NotNull。 你有两种选择:

@NotNull 
@Size(min = 2, max = 50)
private Integer age;

或者像 Riccardo F. 建议的那样:

@NotNull @Min(13) @Max(110)
private Integer age;

【讨论】:

对您的回答稍作修正:@Size 不适用于整数。所以你对整数使用@Min@Max,但对字符串使用@Size。在此处查看@Size 支持的类型:docs.oracle.com/javaee/6/api/javax/validation/constraints/…【参考方案2】:

@NotNull 也用于文本字段,但您可以将它们一起使用,例如

@NotNull @Min(13) @Max(110)
private Integer age;

这意味着 age 不能为 null,并且必须是 13 到 100 之间的值,并且

@NotNull
private Gender gender;

表示性别不能为空

【讨论】:

【参考方案3】:

根据@Size的文档

null 元素被认为是有效的。

供参考hibernate-validation实际的@Size实现在:

org.hibernate.validator.constraints.impl.SizeValidator

所以无论如何都要指定@NotNull

【讨论】:

以上是关于以下验证是不是意味着该字段不能为空? (@Size 注释)的主要内容,如果未能解决你的问题,请参考以下文章

验证电子邮件字段并确保不为空

如果字段为空,如何忽略验证规则?

“验证错误:密码不能为空”但表单中没有密码字段

为啥我不能在自定义字段验证器中返回全局消息键?

验证和突出显示表单字段

asp怎样检查字段是不是为空?