这里写目录标题
- [🎯 核心定义](#🎯 核心定义)
- [📊 与其他注解的区别](#📊 与其他注解的区别)
- [💻 代码示例](#💻 代码示例)
- [🛠️ 如何使用](#🛠️ 如何使用)
- [💡 适用场景建议](#💡 适用场景建议)
@NotBlank 是 Java Bean Validation(数据校验)中一个非常常用的注解,主要用于严格校验字符串。
🎯 核心定义
@NotBlank 专门用于String(字符串)类型的字段或参数。
它的校验逻辑非常严格,要求被注解的字符串必须同时满足以下三个条件:
不能为 null。
不能是空字符串 ""。
不能是纯空白字符(例如:" "、"\t"、"\n" 等,即去除首尾空格后长度必须大于 0)。
📊 与其他注解的区别
为了方便你记忆,我整理了一个对比表格。这是 @NotBlank 最容易混淆的三个注解:
| 注解 | 适用类型 | 校验严格度 | 能否通过纯空格 " " |
|---|---|---|---|
| @NotNull | 所有对象 | 最宽松 | 能 (只检查 null) |
| @NotEmpty | 字符串、集合、数组 | 中等 | 能 (只检查长度/大小) |
| @NotBlank | 仅字符串 | 最严格 | 不能 (会 trim() 后检查) |
一句话总结区别:
@NotNull 只管"有没有"(不为 null)。
@NotEmpty 管"是不是空的"(长度/大小 > 0)。
@NotBlank 管"是不是真的有内容"(必须有非空格字符)。
💻 代码示例
假设我们有一个用户注册的场景:
java
public class User {
// 只要不为 null 就行,可以是 "" 或 " "
@NotNull
private String field1;
// 不能为 null,且长度必须 > 0,所以 " " 是允许的
@NotEmpty
private String field2;
// 不能为 null,不能是 "",且不能是 " " (纯空格会被视为无效)
@NotBlank
private String username;
// getter and setter...
}
测试数据验证结果:
| 输入值 | @NotNull |
@NotEmpty |
@NotBlank |
|---|---|---|---|
null |
❌ 失败 | ❌ 失败 | ❌ 失败 |
"" (空字符串) |
✅ 通过 | ❌ 失败 | ❌ 失败 |
" " (纯空格) |
✅ 通过 | ✅ 通过 | ❌ 失败 |
"abc" (正常内容) |
✅ 通过 | ✅ 通过 | ✅ 通过 |
🛠️ 如何使用
在 Spring Boot 项目中,通常配合 @Valid 或 @Validated 使用。
引入依赖(通常 Spring Boot Starter 已包含):
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
在实体类或 Controller 参数上使用:
java
@RestController
@Validated
public class UserController {
@PostMapping("/register")
public String register(@RequestBody @Valid User user) {
// 业务逻辑
return "success";
}
}
如果前端传入的 username 是 null、"" 或 " ",框架会自动拦截并抛出异常,不会进入业务逻辑。
💡 适用场景建议
使用 @NotBlank:用于业务必填且必须有意义的文本字段,如:用户名、密码、真实姓名、地址、备注等。防止用户"偷懒"只输入空格。
使用 @NotEmpty:用于集合(List/Set)判空,或者字符串只要求长度大于 0(允许空格)的特殊场景。
使用 @NotNull:用于 Long、Integer 等包装类,或者日期类型,或者你只关心对象是否存在而不关心内容的场景。