JAVA后端开发——@NotBlank、@NotNull和@NotEmpty区别

@NotBlank@NotNull@NotEmpty都是 Java 中用于参数校验的注解(主要来自javax.validationorg.hibernate.validator提供),但它们的校验逻辑和适用场景有明显区别:

1. @NotNull

  • 校验逻辑:判断对象是否为null(仅检查 “是否存在”,不关心内容)。
  • 适用类型:所有对象类型(包括基本类型的包装类,如IntegerLong;字符串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,且去空格后长度 > 0String类型名称、描述等字符串输入

常见错误用法

  • Integer类型用@NotBlank:编译不报错,但运行时会校验失败(@NotBlank只支持String)。
  • String类型用@NotNull代替@NotBlank:允许空字符串""或全空格" ",可能不符合业务需求。
  • List@NotBlank:不支持,应使用@NotEmpty

实际开发中,需根据字段类型和业务需求选择合适的注解,通常配合 Spring Validation 使用,在 Controller 层即可自动完成参数校验,减少手动校验代码。

`@NotBlank`、`@NotNull` `@NotEmpty` 注解在参数校验方面存在明显区别,具体如下: - **`@NotNull`**:确保对象不是 `null`,但不检查空字符串或集合的空性。也就是说,只要对象被赋值,即使它是一个空字符串或者空集合,验证也会通过。例如,对于一个 `Integer` 类型的字段,只要它被赋予了一个非 `null` 的值,无论这个值是什么,验证都能通过;对于一个 `String` 类型的字段,即使它是空字符串 `""`,验证同样会通过。 ```java import javax.validation.constraints.NotNull; public class ExampleDTO { @NotNull private Integer id; @NotNull private String name; // Getters and setters public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } ``` - **`@NotBlank`**:专门用于字符串类型的字段,确保字符串不是 `null`,并且去除前后的空白字符后至少包含一个字符。例如,字符串 `" "` 经过去除前后空白字符后为空,使用 `@NotBlank` 注解进行验证时会失败;而字符串 `"abc"` 则验证通过。 ```java import javax.validation.constraints.NotBlank; public class ExampleDTO { @NotBlank private String description; // Getters and setters public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } } ``` - **`@NotEmpty`**:可用于 `CharSequence`、`Collection`、`Map` `Array` 对象,确保这些对象不是 `null`,并且相关对象的大小(`size`)大于 0。对于字符串,只要不是 `null` 且长度大于 0 即可;对于集合数组,只要不是 `null` 且包含至少一个元素就通过验证。 ```java import javax.validation.constraints.NotEmpty; import java.util.List; public class ExampleDTO { @NotEmpty private String address; @NotEmpty private List<String> roles; // Getters and setters public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public List<String> getRoles() { return roles; } public void setRoles(List<String> roles) { this.roles = roles; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值