@NotNull , @NotEmpty , @NotBlank 之间的区别

业务场景模拟:

           在我们web后端的开发过程中通常会对RequestBody中某些字段进行非空校验,所以会用到下列三个注解:

            @NotNull , @NotEmpty , @NotBlank

           使用实例代码:

public class CreateAccessRequest implements Serializable {

    private static final long serialVersionUID = -8724111111971704488L;


    @NotEmpty(message = "Missing Mandatory Field")
    private String applicationCode;

    @NotBlank(message = "Missing Mandatory Field")
    private String partnerCode;

    @NotNull(message = "Missing Mandatory Field")
    private String accessCode;

}

区别分析:

           注解英文注释:

         @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.

         @NotBlank: The string is not null and the trimmed length is greater than
          zero.

           英文注释的自我理解:

         @NotNull: 不能为null,但是可以为Empty(个人理解就是可以为空格(不限制个数)或Tab)
                   即:(""," ","  ")

         @NotEmpty: 不能为null,但是可以为Empty且长度必须大于0
                   即:(" ","   ")

         @NotBlank: 只能使用在String上,不能为Null,而且调用trim()后,长度必须大于0
                   即:必须有实际字符 如:("test")

结合代码实例的结论如下:             

1.String example = null;

@NotNull: false
@NotEmpty:false 
@NotBlank:false 

2.String example = "";

@NotNull:true
@NotEmpty: false
@NotBlank: false

3.String example = " ";

@NotNull: true
@NotEmpty: true
@NotBlank: false

4.String example = "Mandatory(强制性)";

@NotNull: true
@NotEmpty:true
@NotBlank:true

                    

 

 

 

 

<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` 确保字符串有实际字符。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值