spring boot -表单校验步骤 +@NotEmpty,@NotNull和@NotBlank的区别

本文详细解析了Java中@NotEmpty、@NotNull和@NotBlank三种校验注解的区别及使用场景,通过具体代码示例展示了如何在实体类属性上添加注解进行数据验证,并在方法中利用@Valid和BindingResult进行校验结果处理。

  1.实体类属性上添加注解规则 如

public class User {    
  @NotBlank   
  private Integer id ;

2.在方法中添加注解@Valid和一个校验结果参数BindingResult类型

@RequestMapping(value = "/update" ,method = RequestMethod.POST)
public String update(@Valid User user ,BindingResult bindingResult){
  if (bindingResult .hasErrors()) {
    return "/html/edit";
  }

@NotEmpty,@NotNull和@NotBlank的区别
1 @NotEmpty :不能为null,且Size>0 ,不能用于Integer

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

3  @NotBlank:只用于String,不能为null且trim()之后size>0 ,不能用于Integer

 

转载于:https://www.cnblogs.com/hongchengshise/p/10527757.html

<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]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值