Springboot自动校验@NotBlank@NotNull@NotEmpty

1、依赖问题:

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

       
            org.springframework.boot
            spring-boot-starter-validation
       

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。

接口类增加@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 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 doRegForZip(  @Valid @RequestBody FileParseVo vo) {
        System.out.println("vo = " + vo);
        return CommonResult.success("success");
    }

问题3:

嵌套对象注解不生效

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

解决:

 C1 {
     @Valid
     private List 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

你可能感兴趣的:(springboot,spring,boot,java,后端,数据库,spring,开发语言)