@NotNull只校验非null,@NotEmpty要求非null且长度/大小>0,@NotBlank专用于String且要求非null、去空格后长度>0;三者校验强度递减,适用类型依次收窄。

@NotNull、@NotEmpty 和 @NotBlank 都是 Bean Validation 规范中用于字段校验的注解,但它们的校验强度、适用类型和语义重点完全不同。选错注解可能导致校验失效或逻辑不符合业务预期。
@NotNull:只管“有没有”,不管“空不空”
它只判断对象是否为 null,完全不检查内容。只要对象存在(哪怕是一个空字符串 ""、一个空集合 new ArrayList()、或全是空格的字符串 " "),就通过校验。
- 适用所有引用类型(
String、Integer、List、LocalDateTime、自定义对象等) - 不适用于基本类型(如
int、boolean),因为它们无法为null - 典型场景:数据库主键 ID 字段、时间戳字段、必填但允许为空值的数值型参数
@NotEmpty:要求“有内容”,不能是空壳
它在 @NotNull 基础上加了一层检查:对象非 null 后,还必须满足“长度或大小 > 0”。对不同类型的处理如下:
-
String:长度 > 0(""不行,但" "可以过——因为长度是 1) -
List/Set/Map/Array:size()或length> 0 - 不支持数值类型(如
Integer),没有“长度”概念 - 典型场景:用户提交的角色列表、上传的文件名数组、非空但可含空格的备注字段
@NotBlank:专治“假内容”,字符串专属严格校验
它只接受 String 类型,并执行最严格的校验:先判 null,再 trim(),最后检查剩余长度是否 > 0。
立即学习“Java免费学习笔记(深入)”;
-
null→ 失败 -
""→ 失败 -
" "(纯空白)→ 失败(" ".trim().length() == 0) -
" abc "→ 通过(trim()后为"abc") - 典型场景:用户名、密码、标题、描述等需要真实可见字符的输入项
一句话总结三者关系
@NotBlank ⊂ @NotEmpty ⊂ @NotNull——校验范围逐级放宽。@NotBlank 最严(仅 String + 去空格后非空),@NotEmpty 次之(非 null + 有长度/大小),@NotNull 最宽(仅防 null)。


















