@NotBlank、@NotNull和@NotEmpty都是 Java 中用于参数校验的注解(主要来自javax.validation或org.hibernate.validator提供),但它们的校验逻辑和适用场景有明显区别:
1. @NotNull
- 校验逻辑:判断对象是否为
null(仅检查 “是否存在”,不关心内容)。 - 适用类型:所有对象类型(包括基本类型的包装类,如
Integer、Long;字符串String;集合List;自定义对象等)。 - 不适用:基本数据类型(如
int,因为基本类型无法为null)。
@NotNull(message = "模型ID不能为空")
private Long modelId; // 不允许为null,但可以是0(数值类型)
@NotNull(message = "发布时间不能为空")
private LocalDateTime publishedTime; // 不允许为null
2. @NotEmpty
- 校验逻辑:
- 首先检查对象是否为
null(等同于@NotNull的校验)。 - 若对象非
null,再检查其 “长度 / 大小” 是否大于 0。
- 首先检查对象是否为
- 适用类型:字符串(
String)、集合(List/Set/Map)、数组(Array)等有 “长度” 概念的对象。 - 不适用:数值类型(如
Integer,因为数值没有 “长度” 概念)。
@NotEmpty(message = "兼容设备列表不能为空")
private List<String> compatibleDevices;
// 不允许为null,且列表长度必须≥1(至少有一个元素)
@NotEmpty(message = "标签不能为空")
private String[] tags;
// 不允许为null,且数组长度必须≥1
3. @NotBlank
- 校验逻辑:
- 首先检查字符串是否为
null(等同于@NotNull的校验)。 - 若字符串非
null,则去除首尾空白字符(trim())后,检查长度是否大于 0(即不允许全空白字符串)。
- 首先检查字符串是否为
- 适用类型:仅适用于
String类型(专门针对字符串的非空且非空白校验)。
@NotBlank(message = "模型名称不能为空")
private String name;
// 不允许为null,且不能是""(空字符串)或" "(全空格)
三者对比表
| 注解 | 核心校验逻辑 | 适用类型 | 典型场景示例 |
|---|---|---|---|
@NotNull | 不能为null(不检查内容) | 所有对象类型(非基本类型) | 数值(Long)、日期(LocalDateTime) |
@NotEmpty | 不能为null,且长度 / 大小 > 0 | 字符串、集合、数组 | 列表(List)、数组(String[]) |
@NotBlank | 不能为null,且去空格后长度 > 0 | 仅String类型 | 名称、描述等字符串输入 |
常见错误用法
- 对
Integer类型用@NotBlank:编译不报错,但运行时会校验失败(@NotBlank只支持String)。 - 对
String类型用@NotNull代替@NotBlank:允许空字符串""或全空格" ",可能不符合业务需求。 - 对
List用@NotBlank:不支持,应使用@NotEmpty。
实际开发中,需根据字段类型和业务需求选择合适的注解,通常配合 Spring Validation 使用,在 Controller 层即可自动完成参数校验,减少手动校验代码。
1801

被折叠的 条评论
为什么被折叠?



