@NotBlank
、@NotEmpty
和 @NotNull
通常与 Bean Validation 规范(JSR 303/383) 或其实现库(如 Hibernate Validator)配合使用。这些注解用于数据校验,它们的使用逻辑与类型和业务场景相关,以下是具体原因:
总结
注解 | 适用类型 | 校验规则 |
---|---|---|
@NotBlank |
String |
非空,且不全是空白字符(如 "abc" ✅,null ❌,"" ❌," " ❌) |
@NotEmpty |
集合(List 等) |
非空,且至少有一个元素(如 [1,2] ✅,null ❌,[] ❌) |
@NotNull |
所有对象类型 | 非空(如 new Date() ✅,null ❌) |
1. @NotBlank
(针对 String
类型)
- 作用:校验字符串是否 非空 且 不全是空白字符(如空格、换行、制表符等)。
- 适用场景:当需要确保字符串 有实际内容 时使用,例如用户名、密码、表单输入等。
- 示例:
@NotBlank(message = "名称不能为空或空白") private String name;
- 区别于
@NotNull
:@NotBlank
会先检查字符串是否为null
,然后再检查是否为空字符串或全空白字符。而@NotNull
仅检查是否为null
,不关心内容是否为空。
2. @NotEmpty
(针对 List
、Set
、Map
等集合类型)
- 作用:校验集合是否 非空 且 至少包含一个元素。
- 适用场景:当需要确保集合 有实际元素 时使用,例如订单中的商品列表、用户角色列表等。
- 示例:
@NotEmpty(message = "商品列表不能为空") private List<Product> products;
- 区别于
@NotNull
:@NotEmpty
会先检查集合是否为null
,然后再检查是否为空集合(size() == 0
)。而@NotNull
仅检查是否为null
,不关心集合是否为空。
3. @NotNull
(针对 Date
、对象等通用类型)
- 作用:校验对象是否 非空(即不为
null
)。 - 适用场景:当需要确保字段 存在有效值,但不关心其具体值是否“空”时使用。例如日期字段、实体对象引用等。
- 示例:
@NotNull(message = "创建时间不能为空") private Date createTime;
- 区别于其他注解:
@NotNull
是最基础的校验,仅检查对象是否为null
,不关心其内部状态(如Date
是否是合法日期、字符串是否为空等)。
为什么针对不同类型使用不同的注解?
- 类型特性差异:
- 字符串:需要排除全空白字符的情况(如用户输入
" "
)。 - 集合:需要确保集合中至少有一个元素(如订单必须有商品)。
- 对象/日期:只需确保对象存在(如
Date
对象可以是过去的日期,但不能为空引用)。
- 字符串:需要排除全空白字符的情况(如用户输入
- 业务需求:
- 不同类型的数据校验规则不同。例如,一个
Date
字段可能允许任何日期值(只要不为null
),但一个List
必须至少包含一个元素才能有意义。
- 不同类型的数据校验规则不同。例如,一个