@Valid与@Validated区别和详细使用及参数注解校验大全

一、@Validated和@Valid的区别

都必须在controller添加此注解不然校验注解不会生效

分组

@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制,没有添加分组属性时,默认验证没有分组的验证属性
@Valid:作为标准JSR-303规范,还没有吸收分组的功能

位置

@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,如果@Validated注解在成员属性上,则会报不适用于field错误
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能

在接口使用注解进行校验,在类上添加注解:@Validated

嵌套验证

@Validated:用在方法入参上无法单独提供嵌套验证功能,不能用在成员属性(字段)上,也无法提示框架进行嵌套验证,能配合嵌套验证注解@Valid进行嵌套验证。
@Valid:用在方法入参上无法单独提供嵌套验证功能,能够用在成员属性(字段)上,提示验证框架进行嵌套验证,能配合嵌套验证注解@Valid进行嵌套验证

1.分组举例

定义分组接口

public interface IGroupA {
}

public interface IGroupB {
}

定义校验参数Bean

public class StudentBean{
   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {IGroupB.class})
}

controller层

@RestController
public class CheckController {
    @PostMapping("stuA")
    public String addStuA(@Validated({IGroupA.class}) @RequestBody StudentBean studentBean){
        return "add studentA success";
    }
    
    @PostMapping("stuB")
    public String addStuB(@Validated({IGroupB.class}) @RequestBody StudentBean studentBean){
        return "add studentB success";
    }
}
同时调用两个方法,传入参数为age=15
addStuA方法结果为:age:15 add studentA success
addStuA方法结果为:age:年龄不能小于18

注意!

当不分配groups,则每次都要进行验证
对一个参数需要多种验证方式时,可通过分配不同的组

2.组序列

默认情况下 不同级别的约束验证是无序的,但是在一些情况下,顺序验证却是很重要
一个组可以定义为其他组的序列,使用它进行验证的时候必须符合该序列规定的顺序
在使用组序列验证的时候,如果序列前边的组验证失败,则后面的组将不再给予验证

举例:定义组序列

@GroupSequence({Default.class, IGroupA.class, IGroupB.class})
public interface IGroup {
}

需要校验的Bean,分别定义IGroupA对age进行校验,IGroupB对email进行校验:

public class StudentBean implements Serializable {

   @NotBlank(message = "用户名不能为空")
   private String name;

   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {IGroupA.class})
   private Integer age;

   @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
   private String phoneNum;

   @Email(message = "邮箱格式错误", groups = {IGroupB.class})
   private String email;
}

测试代码:

@RestController
public class CheckController {
   @PostMapping("stu")
   public String addStu(@RequestBody @Validated({IGroup.class}) StudentBean studentBean){
      return "add student success";
   }
}

测试结果:只对IGroupA定义的错误进行了校验,IGroupB没有进行校验

3.嵌套校验

一个待验证的pojo类,其中还包含了待验证的对象,需要在待验证对象上注解@Valid,才能验证待验证对象中的成员属性,这里不能使用@Validated

举例:约束校验的bean

public class TeacherBean {
   @NotEmpty(message = "老师姓名不能为空")
   private String teacherName;
   @Min(value = 1, message = "学科类型从1开始计算")
   private int type;
}

public class StudentBean implements Serializable {

   @NotBlank(message = "用户名不能为空")
   private String name;

   //只在分组为IGroupB的情况下进行验证
   @Min(value = 18, message = "年龄不能小于18岁", groups = {IGroupA.class})
   private Integer age;

   @Pattern(regexp = "^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(166)|(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$", message = "手机号格式错误")
   private String phoneNum;

   @Email(message = "邮箱格式错误", groups = {IGroupB.class})
   private String email;

   @NotNull(message = "任课老师不能为空")
   @Size(min = 1, message = "至少有一个老师")
   private List<TeacherBean> teacherBeanList;
}

注意:这里对teacherBeans只校验了NotNull, 和 Size,并没有对teacher信息里面的字段进行校验
这里teacher中的type是不符合约束要求的,但是能检测通过,是因为在student中并没有做嵌套校验。
可以在teacherBeans中加上 @Valid

@Valid
@NotNull(message = "任课老师不能为空")
@Size(min = 1, message = "至少有一个老师")
private List<TeacherBean> teacherBeanList;

这种情况下就对TeacherBean中的参数进行了校验

二、校验注解

//适用于基本数据类型(Integer,Long,Double等等),当 @Null,@NotNull 注解被使用在 String 类型的数据上,则表示该数据(不)能为 Null(但是可以为 Empty)
//必须为null
@Null
//不能为null
@NotNull

//只能作用在String上,不能为null,而且调用trim()后,长度必须大于0
@NotBlank
//适用于 String、Collection集合、Map、数组等等,不能为null,并且长度必须大于0
@NotEmpty

//用于boolean字段,必须为true
@AssertTrue
//用于boolean字段,必须为false
@AssertFalse

//必须为数字,其最小值必须大于等于指定的值
@Min(value)  eg: @Min(100) or @Min(value = 100, message = "最小值为100")
//必须为数字,其最大值必须小于等于指定的值
@Max(value)

//支持Decimal, 只能大于或等于该值
@DecimalMin(value)
//支持Decimal, 只能小于或等于该值
@DecimalMax(value)

//数字必须在范围内
@Range  eg:@Range(min =1 ,max = 100, message = "范围为1-100")
//大小必须在范围内
@Size eg:@Size(min=5, max=10, message="字符串或数组的长度必须在5-10之间")

//校验小数,小数点前支持多少位,小数点后支持多少位
@Digits(integer=6,fraction=2, message="小数点前支持6位,小数点后支持2位")

//必须是一个过去的日期
@Past
//必须是一个将来的日期
@Future

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

//必须是电子邮件地址
@Email

//字符创长度必须在规定范围内,只能用于字符串
@Length(min=,max=)

//字符串非空
@NotEmpty

//对信用卡号进行一个大致的验证
@CreditCardNumber

//检查是否是一个有效的URL,如果提供了protocol,host等,则该URL还需满足提供的条件
@URL(protocol=,host,port)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Tan.]der

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

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

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

打赏作者

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

抵扣说明:

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

余额充值