表单校验之@NotBlank,@NotNull,@NotEmpty之间的区别

本文介绍了Java中三种常用的校验注解:@NotBlank用于确保String类型非空;@NotNull用于验证Integer类型非空;@NotEmpty则适用于检查List类型的非空状态。

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

@NotBlank一般用来校验String类型不能为空

@NotNull一般用来校验Integer类型不能为空

@NotEmpty一般用来校验List类型不能为空

<think>我们正在讨论Java Bean Validation中的两个注解:@NotEmpty@NotBlank。根据引用[1]和引用[2]的内容,我们可以总结如下: 1. **@NotEmpty**: - 适用类型:字符串、集合(如List, Set, Map等) - 验证条件:被注解的元素不能为null,并且字符串长度必须大于0(即不能是空字符串""),集合大小必须大于0(即不能是空集合)。 - 示例无效值:对于字符串:null, "";对于集合:null, [](空集合)。 2. **@NotBlank**: - 适用类型:仅字符串(注意:不能用于集合) - 验证条件:被注解的字符串不能为null,并且必须至少包含一个非空白字符(即不能是空字符串"",也不能是纯空格字符串)。 - 示例无效值:null, "", " "(空格字符串)。 ### 核心区别总结: - **@NotEmpty** 用于确保字符串或集合非空(有内容),但字符串内容可以是空格(如" ")?注意:实际上@NotEmpty对字符串的要求只是长度大于0,所以" "(空格字符串)是合法的,因为它长度大于0。 - **@NotBlank** 专门针对字符串,要求字符串必须有至少一个非空白字符(即trim()后的长度大于0)。所以,对于字符串" "(空格字符串),@NotBlank校验失败,而@NotEmpty会通过。 ### 示例代码说明: ```java public class Example { @NotEmpty private String str1; // 有效值: "a", " ", " "(空格字符串有效,因为长度>0); 无效值: null, "" @NotBlank private String str2; // 有效值: "a", " a "(有非空格字符); 无效值: null, "", " "(纯空格) } ``` ### 组合使用建议(引用[1]): 在复杂场景中,可以组合使用注解。例如: ```java public class Product { @NotNull // 确保对象不为null @NotEmpty // 确保名称非空(且长度>0) private String name; } ``` 但注意,对于字符串,如果你希望它非空且不能是纯空格,那么应该使用`@NotBlank`,而不需要同时使用`@NotNull`和`@NotEmpty`,因为`@NotBlank`已经隐含了非null且至少有一个非空白字符(即长度至少为1,且不是全空格)。 ### 错误处理: 当验证失败时,会抛出`ConstraintViolationException`(在方法参数验证中可能是`MethodArgumentNotValidException`),可以通过全局异常处理器捕获并返回友好错误消息。 ### 性能考虑: 这些注解在运行时通过反射验证,性能开销小,适合高频API调用。 ### 相关问题: 1. 在Spring Boot中如何自定义验证错误消息? 2. 如何为集合类型(如List)使用@NotEmpty注解? 3. 除了@NotEmpty@NotBlank,还有哪些常用的Bean Validation注解?</think>### Java Bean Validation 中 `@NotEmpty` 与 `@NotBlank` 的区别详解 #### 1. **核心差异对比** | 特性 | `@NotEmpty` | `@NotBlank` | |------------------|--------------------------------------|--------------------------------------| | **适用类型** | 字符串、集合(List/Set/Map) | **仅字符串** | | **验证条件** | 非 null + 非空(长度 > 0 或大小 > 0)| 非 null + 至少一个非空白字符 | | **无效值示例** | `null`, `""`, `[]` | `null`, `""`, `" "`(纯空格) | | **空格处理** | 允许纯空格字符串(如 `" "`) | **禁止纯空格** | | **严格等级** | ★★☆☆☆ | ★★★★★ | > **关键区别**:`@NotBlank` 是 `@NotEmpty` 的严格升级版,专为字符串设计,额外要求**内容不能是纯空白字符**[^1]。 --- #### 2. **代码行为演示 ```java public class User { // 允许:"a", " "(纯空格) | 拒绝:null, "" @NotEmpty(message = "姓名不能为空") private String name1; // 允许:"a", " a " | 拒绝:null, "", " "(纯空格) @NotBlank(message = "姓名需包含有效字符") private String name2; } ``` - **`@NotEmpty` 通过但 `@NotBlank` 失败的情况**: ```java user.setName1(" "); // 通过(纯空格) user.setName2(" "); // 失败!触发message ``` --- #### 3. **实际应用场景建议** 1. **表单输入校验**: - 用 `@NotBlank` 验证用户名/地址(避免用户输入空格糊弄系统) - 用 `@NotEmpty` 验证下拉菜单选项(只需确保有选择) 2. **组合使用增强校验**: ```java public class Product { @NotNull @NotBlank // 双重保障:非null + 非空白 private String skuCode; } ``` 3. **集合类专用**: ```java public class Order { @NotEmpty // 仅用于集合:确保items非空 private List<Item> items; } ``` --- #### 4. **错误处理机制 当校验失败时: ```java // Spring 中自动捕获异常 @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity<Error> handleValidationException( MethodArgumentNotValidException ex) { // 提取错误信息: ex.getBindingResult().getAllErrors() } ``` - 返回示例:`{"field": "name2", "message": "姓名需包含有效字符"}`[^2] --- ### 总结选择策略 | 场景 | 推荐注解 | |-------------------------------|---------------| | 需严格拒绝纯空格的文本字段 | `@NotBlank` | | 允许空格但禁止空值的文本字段 | `@NotEmpty` | | 集合/数组的非空校验 | `@NotEmpty` | | 基础非null校验(非字符串) | `@NotNull` | > **性能提示**:这些注解通过编译时字节码增强实现,运行时开销极小(纳秒级)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值