springboot中@NotEmpty ,@NotNull的区别

本文详细解析了@NotNull与@NotEmpty两个Java验证注解的区别,前者用于确保对象不为null,允许为空;后者则确保对象不仅不为null,而且大小必须大于0。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 @NotEmpty :不能为null,且Size>0

2  @NotNull:不能为null,但可以为empty,没有Size的约束。

官方文档解释:

@NotNull: The CharSequence, Collection, Map or Array object is not null,
but can be empty.

@NotEmpty: The CharSequence, Collection, Map or Array object is not null
and size > 0.

 

 

<think>我们正在讨论Java中的@NotNull@NotEmpty注解的区别。根据引用内容,我们可以总结如下:1.**@NotNull**:-功能:仅检查对象引用是否为null。如果对象引用不为null,则通过校验。-适用类型:可用于任何类型的对象(包括String、集合、自定义对象等)。-不检查内容:对于字符串,即使字符串是空字符串("")或空白字符串(""),只要不是null,就满足条件。-基本数据类型:不适用于基本数据类型(如int、long),因为基本数据类型不能为null。2.**@NotEmpty**:-功能:检查对象引用不为null,并且对象的内容不为空。对于字符串,要求字符串长度大于0(即不能是空字符串"");对于集合,要求集合中至少有一个元素。-适用类型:主要用于字符串、集合、数组、Map等有长度或大小概念的类型。-注意:对于字符串,@NotEmpty不检查空白字符。例如,字符串""(由空格组成)会被认为非空,因为它长度大于0。3.使用场景:-使用@NotNull:当你只关心字段不能为null,但可以接受空字符串或空集合时。-使用@NotEmpty:当你要求字段不仅不能为null,而且内容不能为空(例如,字符串至少有一个字符,集合至少有一个元素)。4.与@NotBlank的区别:-@NotBlank(未在问题中直接询问,但引用中提及)是专门针对字符串的,它会检查字符串不为null,并且去除首尾空白字符后长度大于0。因此,空白字符串(如"")会被@NotBlank视为无效,而@NotEmpty则视为有效。5.底层实现:-@NotNull:由NotNullValidator实现,核心逻辑是`value!=null`。-@NotEmpty:由NotEmptyValidator实现,核心逻辑是`value!=null&&value.length()>0`(对于字符串)或`value.size()>0`(对于集合)。6.依赖:-这些注解通常需要添加依赖(如SpringBoot中的`spring-boot-starter-validation`)和相应的实现库(如HibernateValidator)。7.常见误区:-对于字符串,如果希望排除空白字符串,应该使用@NotBlank而不是@NotEmpty。示例代码:```javapublicclassUser{@NotNull//不能为null,但可以是空字符串privateStringname1;@NotEmpty//不能为null且不能是空字符串(但可以是空白字符串)privateStringname2;@NotBlank//不能为null且不能是空白字符串(必须包含非空白字符)privateStringname3;@NotEmpty//集合不能为null且必须至少有一个元素privateList<String>emails;}```总结:-选择注解取决于业务需求:是否需要完全排除空值(包括空字符串、空集合等)。-注意字符串的空白问题:@NotEmpty不处理空白,而@NotBlank会处理。相关问题:1.在SpringBoot中如何集成验证注解?2.如何自定义验证注解?3.@NotBlank注解的使用场景是什么?4.如何为基本数据类型(如int)添加非空验证?</think>### Java 中 `@NotNull` 与 `@NotEmpty` 注解的区别详解 #### 一、核心功能差异 | **特性** | **`@NotNull`** | **`@NotEmpty`** | |----------------|-----------------------------------------|------------------------------------------| | **主要作用** | 仅验证对象引用是否为 `null` | 验证对象引用非 `null` **且** 内容非空 | | **校验逻辑** | `value != null` | `value != null && value.length() > 0` | | **适用类型** | 任意对象类型(包括 String、集合、对象) | 仅限有长度概念的类型(String、集合、数组)| | **空字符串** | 允许空字符串(如 `""`) | **禁止**空字符串 | | **空白字符串** | 允许空白字符串(如 `" "`) | 允许空白字符串(需用 `@NotBlank` 禁止)[^1] | #### 二、使用场景对比 1. **`@NotNull` 典型场景**: ```java public class User { @NotNull // 确保对象存在,但内容可为空 private Address address; // 对象引用 } ``` - 验证对象引用非 `null`(如数据库关联对象) - 基本数据类型(`int`, `long`)不可用,需改用 `@Min`/`@Max`[^1] 2. **`@NotEmpty` 典型场景**: ```java public class RegistrationForm { @NotEmpty // 禁止 null 和空字符串 private String username; // 字符串字段 @NotEmpty // 禁止 null 和空集合 private List<String> roles; // 集合字段 } ``` - 表单必填字段(用户名、密码) - 集合/数组非空验证(如权限列表) #### 三、底层实现原理 | **维度** | **`@NotNull`** | **`@NotEmpty`** | |----------------|-----------------------------------------|------------------------------------------| | **实现类** | `NotNullValidator` | `NotEmptyValidator` | | **核心逻辑** | 仅检查 `value != null` | 先检查 `value != null`,再调用 `value.isEmpty()` | | **依赖规范** | JSR 380 (Bean Validation) | JSR 380 (Bean Validation) | | **校验器示例** | `if (value == null) return false;` | `if (value == null || value.isEmpty()) return false;`[^2] | #### 四、常见误区与解决方案 1. **误用场景**: - 错误:对 `String` 使用 `@NotNull` 允许空字符串 `""` - 正确:用 `@NotEmpty` 禁止空字符串 2. **空白字符串问题**: - `@NotEmpty` 允许 `" "`(含空格) - **解决方案**:改用 `@NotBlank`(验证非空白字符)[^1] 3. **组合使用示例**: ```java public class Product { @NotNull // 1. 先确保对象非null @NotEmpty // 2. 再验证字符串非空 private String serialNumber; } ``` #### 五、技术依赖 需添加 Bean Validation 实现(如 Hibernate Validator): ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> ``` > **总结**: > - 优先用 `@NotNull`:确保**对象引用存在** > - 优先用 `@NotEmpty`:确保**内容有实际值**(字符串/集合) > - 严格文本输入用 `@NotBlank`:排除**空白字符串** --- ### 相关问题 1. 如何在 Spring Boot 中实现自定义校验注解(如手机号格式)?[^4] 2. `@NotBlank` 和 `@NotEmpty` 在处理空白字符串时有何具体区别? 3. 如何为基本数据类型(如 `int`)实现非空验证? 4. 在 REST API 中如何统一处理校验失败的错误响应? [^1]: 引用内容 1 [^2]: 引用内容 2 [^4]: 引用内容 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值