@notnull只校验非null,适用于所有类型;@notblank专用于string,要求非null且trim后长度>0。选型依据业务语义:需实际可见文字用@notblank,仅防null用@notnull。

@NotNull 和 @NotBlank 都是 Spring Boot 中用于参数校验的注解,但它们检查的目标和适用场景完全不同,不能互相替代。
@NotNull:只管“有没有”,不管“空不空”
它适用于所有类型(String、Integer、List、自定义对象等),核心判断标准只有一个:值不能为 null。只要分配了内存、有具体值(哪怕是空字符串 ""、0、空集合 []),就通过校验。
- String userName = ""; → ✅ 通过(不为 null)
- String userName = " "; → ✅ 通过(不为 null,哪怕全是空格)
- Integer age = 0; → ✅ 通过
- List items = new ArrayList(); → ✅ 通过(空集合但非 null)
- String userName = null; → ❌ 失败
@NotBlank:专治“假内容”,只用于 String
它只能标注 String 类型字段,要求更严格:必须同时满足两个条件——不为 null,且 trim() 后长度 > 0。也就是说,不能是 null、不能是 ""、也不能是只含空格/制表符的字符串。
- String name = "张三"; → ✅ 通过
- String name = " 张三 "; → ✅ 通过(trim 后有效)
- String name = ""; → ❌ 失败
- String name = " "; → ❌ 失败(trim 后为空)
- String name = null; → ❌ 失败
- Integer age = 25; → ❌ 编译报错(类型不匹配,@NotBlank 不支持非 String)
怎么选?看业务语义
选哪个不是看“哪个更严”,而是看你要表达什么规则:
- 用户昵称、真实姓名、标题等——必须有实际可见文字 → 用 @NotBlank
- 用户是否启用某功能(布尔开关)、订单状态码(Integer)、外键 ID(Long)等——只需确保传了值,允许默认值或零值 → 用 @NotNull
- 如果字段是 String,但业务上允许存空格或空串(极少见),又必须防 null → 才考虑 @NotNull + 手动 trim 判断
常见错误提醒
别把 @NotBlank 加在 Integer 或 List 上,会直接抛 UnexpectedTypeException;也别指望 @NotNull 能拦住 " " 这种纯空白字符串——它完全放行。











