隐藏

常用校验注解@NotEmpty,@NotBlank,@NotNull,@Valid,@Validated用法区别,以及搭配 BindingResult使用,嵌套验证等

发布:2023/8/26 11:38:51作者:管理员 来源:本站 浏览次数:448

文章目录

一、常用注解@NotEmpty,@NotBlank,@NotNull介绍

二、@Valid与@Validated的使用与区别

2.1@Valid与@Validated区别:

2.2嵌套验证

三、总结

一、常用注解@NotEmpty,@NotBlank,@NotNull介绍

包位置:javax.validation.constraints.xxx


@NotEmpty 用在集合上面,一般用来校验List类型(不能注释枚举),而且长度必须大于0


@NotBlank 用在String上面,一般用来校验String类型不能为空,而且调用trim()后,长度必须大于0。


@NotNull 用在所有类型上面,一般用来校验Integer类型不能为空,但可以为empty。


需要搭配@Valid使用,在检验Controller的入参是否符合规范时


使用方法如下:


public class RegisterVo {

   @NotBlank(message = "昵称不能为空")

   private String nickname;


   @NotBlank(message = "手机号不能为空")

   private String mobile;


   @NotBlank(message = "密码不能为空")

   private String password;

}



public JSONResult register(@Validated @RequestBody RegisterVo registerVo){}


此包下的其他注解:(赶紧收藏!需要用到的时候打开查看直接用!!)


注解 含义

@Null 元素必须为null

@NotNull 元素不能null

@AssertTrue 元素必须为true

@AssertFalse 元素必须是false

@Min(value) 元素必须是一个数字,其值必须大于等于指定的最小值

@Max(value) 元素必须是一个数字,其值必须小于等于指定的最大值

@DecimalMin(value) 元素必须是一个数字,其值必须大于等于指定的最小值

@DecimalMax(value) 元素必须是一个数字,其值必须小于等于指定的最大值

@Size(max,min) 元素的大小必须在指定的范围内

@Digits(integer,fraction) 元素必须是一个数字,其值必须在可接受的范围内

@Past 元素必须是一个过去的日期

@Future 元素必须是一个将来的日期

@Pattern(value) 元素必须符合指定的正则表达式

@Email 元素必须是电子邮箱地址

@Length 字符串的大小必须在指定的范围内

@NotEmpty 字符串必须非空

@Range 元素必须在合理的范围内

当然知道了上面注解的用法后,还需要知道@Valid与@Validated的使用与区别


二、@Valid与@Validated的使用与区别

@Valid、@Validated 注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则

校验规则如上@NotEmpty,@NotBlank,@NotNull等等的注解就是,不加上就不会生效!

@Valid 包位置:javax.validation

@Validated 包位置 org.springframework.validation.annotation

是@Valid 的一次封装,是Spring提供的校验机制使用。


2.1@Valid与@Validated区别:

相同点: 在检验Controller的入参是否符合规范时,使用@Validated或者@Valid都可以实现,并且需要传入BindingResult对象,用于获取校验失败情况下的反馈信息,如下代码:


   @PostMapping("register")

                            //@Valid这两个用哪个效果都一样

   public JSONResult register(@Validated @RequestBody RegisterVo registerVo, BindingResult bindingResult){


//会把校验失败情况下的反馈信息

       if (bindingResult.hasErrors()) {

           System.out.println(bindingResult.getFieldError().getDefaultMessage());

           return JSONResult.error().message(bindingResult.getFieldError().getDefaultMessage());

       }

       memberService.register(registerVo);

       return JSONResult.ok();

   }


不同点:2个方面如下


1、分组上:


@Valid 不支持分组, @Validated则支持分组验证。


2、使用位置:


@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上


2.2嵌套验证

如果我们需要用到嵌套验证,(什么是嵌套验证)看代码上的注释哦

代码如下:


为了能够进行嵌套验证,必须手动在Person实体的son字段上明确指出这个字段里面的实体也要进行验证。


class Person {

   @NotNull

   private Integer id;


   @NotNull

   /**

    * @Validated不允许使用在成员属性上,所以只能用@Valid

    * 如果不加  @Valid 就不会对 Son类进行校验,只会判断 @NotNull,List<Son>是否为空,并不会Son类里面的成员属性

    */

   @Valid //嵌套验证

   private List<Son> son;

}


class Son {

   @NotNull

   private Integer sid;


   @NotBlank(message = "姓名不能为空")

   private String name;


}


class MemberController {


   @ApiOperation(value = "会员注册")

   @PostMapping("register")

                             //使用@Validated或者@Valid都可以,这样就完成了嵌套验证

   public JSONResult register(@Validated @RequestBody Person person, BindingResult bindingResult){


       if (bindingResult.hasErrors()) {

           System.out.println(bindingResult.getFieldError().getDefaultMessage());

           return JSONResult.error().message(bindingResult.getFieldError().getDefaultMessage());

       }

       return JSONResult.ok();

   }


}


三、总结

1、常用校验注解@NotEmpty,@NotBlank,@NotNull,需要搭配@Valid或@Validated使用

2、@Valid或@Validated 中有 BindingResult,可以获取校验失败情况下的反馈信息,如果不添加,默认情况下会抛出对应的异常。

3、@Validated无法单独提供嵌套验证功能。不能用在成员属性上,能配合嵌套验证注解@Valid进行嵌套验证。

@Valid无法单独提供嵌套验证功能。能够用在成员属性上,能配合嵌套验证注解@Valid进行嵌套验证。