springboot自动校验@NotBlank@NotNull@NotEmpty(2.4有小坑)

controller 实体类,参数 自动验证

1、依赖问题:

查看搭建的SpringBoot项目中 @NotEmpty 是否可以引用,查询资料发现从SpringBoot 2.3.0之后放弃了默认对javax.validation 的支持。

         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>

2、注解

@NotBlank:只用在String上,表示传进来的值不能为null,而且调用trim()后,长度必须大于0 @NotNull:不能为null,但可以为empty(分配了内存空间,但值为空) @NotEmpty:不能为null,而且长度必须大于0

@NotBlank://String 不能是 null 且去除两端空白字符后的长度(trimmed length)大于 0。

@NotNull://CharSequence, Collection, Map 和 Array 对象不能是 null, 但可以是空集(size = 0)。

@NotEmpty://CharSequence, Collection, Map 和 Array 对象不能是 null 并且相关对象的 size 大于 0。

3、使用方法

其他:https://www.cnblogs.com/whiteme/p/13612652.html

 接口类增加@Validated  ## 主要试 非实体类的 注解(@NotXX)生效
 接口类中方法参数增加@Valid ### 主要使 实体类 生效
 ​
 实体类中 增加 @NotBlank、@NotEmpty、@NotNull
 ​
 注意:
 Integer 只能使用:@NotNull 并且@NotNUll和@Pattern不能共用
 ​
 例如:

 ​
     @GetMapping("/test")
     public String doWxTrade2(
        @RequestParam(value = "name", required = false) String name,
        @NotEmpty @RequestParam(value = "name2", required = true) String name2,
        @NotNull @RequestParam(value = "age", required = true) Integer age) {
           System.out.println("进入方法中");
           return "执行解析完成";
     }
  
     @PostMapping("/wxPayRegInfo")
     public CommonResult<String> doRegForZip(@Valid @RequestBody FileParseVo vo) {
         System.out.println("vo = " + vo);
         return CommonResult.success("success");
     }
     
     @Data
     @AllArgsConstructor
     @NoArgsConstructor
     public class FileParseVo implements Serializable {
         @NotBlank(message = "areaCode 不允许为空")
         private String areaCode;
         @NotBlank(message = "filePath 不允许为空")
         private String filePath;
         @NotNull(message = "fileId 不允许为空")
         private Integer fileId;
     }
 ​

4、异常问题

问题1:

 使用方式:
 @NotEmpty(message = "fileId 不允许为空")
     private Integer fileId;
     
 问题异常:javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.Integer'. Check configuration for 'fileId'
     at 。。。。    

解决:

     @NotNull(message = "fileId 不允许为空")
     private Integer fileId;

问题2:

注解不生效问题

方法里面增加 @Valid

     @PostMapping("/wxPayRegInfo")
     public CommonResult<String> doRegForZip(  @Valid @RequestBody FileParseVo vo) {
         System.out.println("vo = " + vo);
         return CommonResult.success("success");
     }

问题3:

嵌套对象注解不生效

 问题方式:
 实体类1:
  C1 {
   private List<xxxInfo> xxxInfos;
  }
  xxxInfo{
     @NotNull(message = "fileId 不允许为空")
     private Integer fileId;
  }
  接口:
     @PostMapping("/wxPayRegInfo")
     public CommonResult<String> doRegForZip(  @Valid @RequestBody C1 vo) {
         System.out.println("vo = " + vo);
         return CommonResult.success("success");
     } 
  C1 里面的 xxxInfo 里面的 fileId不生效

解决:

  C1 {
      @Valid
      private List<xxxInfo> xxxInfos;
  }

问题4:@NotNUll和@Pattern不能共用

constraint ‘javax.validation.constraints.Pattern‘ validating type ‘java.lang.Integer‘.

错误代码

 @NotNull(message = "最低取样数不能为空")
 @Pattern(regexp = "^[3-9][0-9]{2}|[1-9][0-9]{3}[0-9]*?$")
 private Integer minSampleSum;

运行异常

javax.validation.UnexpectedTypeException: HV000030: No validator could be found for constraint 'javax.validation.constraints.Pattern' validating type 'java.lang.Integer'. Check configuration for 'minSampleSum' at

异常原因: 在Spring中如果使用了@NotNull就不能使用@Pattern,两者不能共存。 如果想使用@Pattern可以把属性定义为基本数据类型,@NotNull更换成@NotBlank使用。

问题5:

注解不生效

接口类、方法类上增加@Validated

喜欢小编的可以关注公众号,点击关于我,加入QQ群,群文件有大量大厂Java面试pdf等免费资源!!!

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
@NotNull和@NotBlank是两种常用的校验注解,它们有以下区别: 1. @NotNull: 这个注解表示被标注的字段不能为null,但可以为空字符串。它通常用于对基本数据类型的非空校验上,可以结合@Size、@Max、@Min等注解对字段数值进行大小的控制。 2. @NotBlank: 这个注解表示被标注的字段不能为null,并且调用trim()方法后,字符串的长度必须大于0。注意,@NotBlank只能用在String类型的字段上。 举例来说,如果我们有一个String类型的字段name,使用@NotNull注解,那么name字段不能为null,但可以为空字符串""。如果使用@NotBlank注解,则name字段不能为null,并且不能为空字符串,即必须有实际的字符内容。 总结起来,@NotNull用于基本数据类型的非空校验,@NotBlank用于String类型的非空校验,并且需要有实际的字符内容。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [常用的校验注解之 @NotNull、@NotBlank、@NotEmpty 的区别](https://blog.csdn.net/weixin_49770443/article/details/109772162)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [Spring注解@NoNull、@NotEmpty、@NotBlank的区别及注解无效以及嵌套对象的无效解决办法](https://blog.csdn.net/wounler/article/details/124378538)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [常用校验注解@NotEmpty,@NotBlank,@NotNull,@Valid,@Validated用法区别,以及搭配 BindingResult使用,...](https://blog.csdn.net/weixin_46015018/article/details/122637042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

航迹者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值