@NotEmpty、@NotBlank、@NotNull 区别和使用

本文详细解析了Java中@NotNull、@NotBlank、@NotEmpty三个校验注解的区别与应用场景,帮助开发者正确选择并使用这些注解,确保参数的有效性和程序的健壮性。

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

首先需要说明下,本提到的 @NotEmpty、@NotBlank、@NotNull 分别是
javax.validation.constraints.NotEmpty、javax.validation.constraints.NotBlank 、javax.validation.constraints.NotNull。

通过注解的方式我们可以更加优雅的对参数的格式进行校验,但是在使用 @NotEmpty、@NotBlank、@NotNull 的过程中,由于含义有点类似,所以导致使用的时候会有一些迷茫,下面,对这三个注解逐一进行使用上的说明:

  1. @NotNull
    适用于基本数据类型(Integer,Long,Double等等),当 @NotNull 注解被使用在 String 类型的数据上,则表示该数据不能为 Null(但是可以为 Empty)
  2. @NotBlank
    适用于 String 类型的数据上,加了@NotBlank 注解的参数不能为 Null 且 trim() 之后 size > 0
  3. @NotEmpty
    适用于 String、Collection集合、Map、数组等等,加了@NotEmpty 注解的参数不能为 Null 或者 长度为 0

在使用这些注解的时候,还需要注意一点(注:否则会造成注解无效哦!!),那就是在Controller 层定义方法的时候在参数位置上加上 @Valid(javax.validation.Valid) 注解!!!如下图:
在这里插入图片描述

<think>首先,用户的问题是:“我想理解Java中不同Bean Validation注解的区别 请问Java Bean Validation @NotNull @NotEmpty @NotBlank 区别”。这是关于Java Bean Validation中三个注解的区别@NotNull@NotEmpty @NotBlank。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题,保证回答真实可靠。 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 参考站内引用:引用[1]、[2]、[3]、[4]提供了相关信息。我需要引用这些内容,并在末尾添加引用标识。 关键点从引用中提取: - 引用[1]: @NotNull@NotEmpty @NotBlank 区别@NotNull 用于验证不为null。 - 引用[2]: 详细解释: - @NotNull:验证基本类型或对象引用不为null。 - @NotBlank:验证字符串不为null且内容不为空(即必须有非空格字符)。 - @NotEmpty:验证集合或字符串不为null且不为空。 - 引用[3]: 三者的区别: - @NotNull:仅不为null。 - @NotEmpty:不为null且不为空(适用于集合或字符串)。 - @NotBlank:不为null且内容不为全空格(仅适用于字符串)。 - 引用[4]: 提供了一些其他注解,但重点在@NotEmpty@NotNull@NotBlank。 我需要整合这些信息,形成清晰的回答。 回答结构: 1. **介绍**:简要介绍Java Bean Validation这些注解。 2. **详细解释每个注解**: - @NotNull - @NotEmpty - @NotBlank 3. **比较区别**:使用表格或列表形式清晰地展示区别。 4. **示例**:提供代码示例来说明用法。 5. **总结**:重申关键点。 6. **生成相关问题**:在末尾添加相关问题。 由于用户要求生成相关问题,我需要创建3-5个相关问题,类似于示例中的格式。 确保使用中文回答。 现在,构建回答: - **标题**:可以直接用“Java Bean Validation注解 @NotNull@NotEmpty @NotBlank区别” - **内容**: - 开头介绍:Java Bean Validation (JSR 380) 是用于验证对象属性的规范,这些注解用于确保数据有效性。 - 解释每个注解: - @NotNull:确保字段不为null。适用于任何类型。 - @NotEmpty:确保字段不为null且不为空。适用于字符串(长度>0)、集合(大小>0)等。 - @NotBlank:确保字符串不为null、不为空且包含至少一个非空格字符。仅适用于字符串。 - 比较:使用表格或列表。 - | 注解 | 适用类型 | 验证条件 | |------|----------|----------| | @NotNull | 所有类型 | 不为null | | @NotEmpty | 字符串、集合 | 不为null且不为空 | | @NotBlank | 字符串 | 不为null、不为空、且至少一个非空格字符 | - 示例代码: ```java public class User { @NotNull private String name; // 不能为null @NotEmpty private String email; // 不能为null或空字符串 @NotBlank private String password; // 不能为null、空字符串或全空格 @NotEmpty private List<String> roles; // 不能为null或空列表 } ``` - 总结:@NotNull是最基本的,@NotEmpty更严格(包括非空),@NotBlank最严格(针对字符串)。 - **引用**:在解释中自然地添加引用标识。例如,在提到区别时,添加[^2]或[^3]。 - **相关问题**:生成3-5个相关问题,以“§§相关问题§§”开头。 相关问题想法: 1. 如何在Spring Boot中集成Bean Validation? 2. @NotNull@NotEmpty@NotBlank的性能影响如何? 3. 除了这些,Bean Validation中还有哪些常用注解? 4. 如何处理验证失败时的异常? 5. 在REST API中如何应用这些注解? 确保回答真实可靠,基于提供的引用。 最后,输出格式: - 使用Markdown格式。 - 数学表达式:用户问题中没有数学,所以可能不需要,但如果有数学表达式,必须用$...$。 - 独立公式:同样,可能不需要。 - 中文回答。</think>### Java Bean Validation注解 @NotNull@NotEmpty @NotBlank区别 Java Bean Validation(JSR 380)是用于验证对象属性的规范,常用于后端开发中确保数据有效性。`@NotNull`、`@NotEmpty` `@NotBlank` 是其中常用的非空验证注解,但它们有显著区别。下面我将逐步解释每个注解的含义、适用场景区别,帮助您清晰理解。 #### 1. **@NotNull 注解** - **含义**:验证字段值不为 `null`。这是最基本的非空检查,适用于任何类型(如对象引用、基本类型包装类)。 - **适用类型**:所有类型(包括 `String`、`List`、自定义对象等)。 - **验证条件**:仅检查是否为 `null`,不关心内容是否为空。例如: - 如果字段是 `String`,允许空字符串 `""`。 - 如果字段是 `List`,允许空集合 `[]`。 - **示例代码**: ```java public class User { @NotNull(message = "姓名不能为null") private String name; // 允许 name = "",但不允许 name = null } ``` - **使用场景**:当您只关心字段是否被初始化,而不在意内容是否为空时使用[^2]。 #### 2. **@NotEmpty 注解** - **含义**:验证字段值不为 `null` 且不为空。比 `@NotNull` 更严格,要求内容必须存在。 - **适用类型**:字符串(`String`)集合类(如 `List`、`Set`)。 - **验证条件**: - 对于字符串:长度必须大于 0(即不能是 `""`)。 - 对于集合:大小必须大于 0(即不能是空集合 `[]`)。 - 注意:允许字符串包含空格(如 `" "`)。 - **示例代码**: ```java public class User { @NotEmpty(message = "邮箱不能为空") private String email; // 不允许 email = null 或 email = "",但允许 email = " " @NotEmpty(message = "角色列表不能为空") private List<String> roles; // 不允许 roles = null 或 roles = [] } ``` - **使用场景**:适用于需要确保字符串或集合有实际内容的场景,如表单字段或列表初始化[^3]。 #### 3. **@NotBlank 注解** - **含义**:验证字符串字段值不为 `null`、不为空字符串,且至少包含一个非空格字符。这是最严格的字符串验证。 - **适用类型**:仅适用于字符串(`String`)。 - **验证条件**: - 字符串不能是 `null`。 - 字符串不能是空字符串 `""`。 - 字符串不能只包含空格(如 `" "` 无效,但 `"a "` 有效)。 - **示例代码**: ```java public class User { @NotBlank(message = "密码不能为空白") private String password; // 不允许 password = null、"" 或 " " } ``` - **使用场景**:适用于密码、用户名等需要非空白字符的输入字段[^3]。 #### 4. **三者的主要区别总结** 下表直观对比关键差异: | 注解 | 适用类型 | 验证条件 | 示例(无效值) | |------------|-------------------|--------------------------------------------------------------------------|------------------------------| | **@NotNull** | 所有类型 | 值不为 `null` | `null` | | **@NotEmpty**| 字符串、集合 | 值不为 `null`,且字符串长度 > 0 或集合大小 > 0 | `null`, `""`, `[]` | | **@NotBlank**| 仅字符串 | 值不为 `null`,且字符串至少有一个非空格字符 | `null`, `""`, `" "` | - **核心区别**: - `@NotNull` 只防 `null`,不防空内容。 - `@NotEmpty` 防 `null` 空内容,但允许空格字符串。 - `@NotBlank` 最严格,专为字符串设计,确保内容非空白[^2][^3]。 #### 5. **实际应用建议** - **组合使用**:在复杂场景中,可以组合注解。例如: ```java public class Product { @NotNull // 确保对象不为null @NotEmpty // 确保名称非空 private String name; } ``` - **错误处理**:验证失败时,会抛出 `ConstraintViolationException` 或 `MethodArgumentNotValidException`,可通过全局异常处理器捕获并返回友好错误消息[^4]。 - **性能考虑**:这些注解在运行时通过反射验证,性能开销小,适合高频 API 调用[^1]。 通过以上解释,您应该能清晰区分这些注解。记住,选择哪个注解取决于具体需求:用 `@NotNull` 确保存在性,用 `@NotEmpty` 确保非空内容,用 `@NotBlank` 确保字符串有实际字符。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cab5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值