校验(@Valid @Valided)

Exisi 2022-06-28 22:51:08
Categories: Tags:
  • Hibernate Validator jakarta.validation 提供了 @Valid 注解,用于与校验注解一起使用。

 

  • Spring Validation  验证框架对参数的验证机制提供了 @Validated,在检验Controller的入参是否符合规范时,使用 @Validated 或者 @Valid 在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同

 

注解

提供者

是否支持分组

标注位置

嵌套校验

@Valid

Hibernate validation

不支持

方法,

类或对象中的变量,

构造函数,

方法或构造函数中接收输入值的变量,

类型使用,指在Java程序中使用类型的方式,例如声明变量、方法返回类型、参数类型等。

支持

@Validated

Spring Validation

支持

类型,

方法,

方法或构造函数中接收输入值的变量

不支持

  • @Valid 注解无任何参数,而 @Validated 注解可以传入一个 Value 传入不同接口类用于分组校验

 

  • @Validated 不能在类的成员变量上使用,因此不支持嵌套校验

 

 

使用 @Valid / @Validated 校验参数

  • @Valid@Validated必需使用在以@RequestBody接收参数的情况下。

示例

  • User.java

public class User {

 

@NotNull

@Size(min = 4, max = 15)

private String password;

 

@NotBlank

private String name;

 

 // standard constructors / setters / getters / toString

 

}

 

  • MainController.java

@Controller

Public class MainController(){

@RequestMapping("/test")    

public String testValid(@Valid User user, BindingResult result){

   

    return "test";

}

 

@RequestMapping("/test1")    

public String testValidated(@Validated User user, BindingResult result){

   

    return "test";

}

}

  • 当请求时,就会对实体类参数是否为空进行验证

 

 

@Valid / @Validated 嵌套验证

  • 当一个实体类引用另一个实体类作为参数时,被引用的实体类的参数验证注解无法执行,因此需要 @Valid 注解在被引用的实体类参数上,提示验证框架对嵌套的实体类也执行验证

示例

  • School.java

public class User {

 

@Valid

@NotNull(message = "uid不能为空")

@Min(value = 1, message = "uid必须为正整数")

private int id;

 

@Valid

@NotNull(message = "age不能为空")

@Min(value = 1, message = "age必须为正整数")

private int age;

 

// standard constructors / setters / getters / toString

 

}

 

  • User.java

public class User {

 

@NotNull(message = "uid不能为空")

private int uid;

 

@NotNull(message = "age不能为空")

private int age;

 

@NotNull(message = "age不能为空")

private School school;

 

// standard constructors / setters / getters / toString

 

}

 

  • MainController.java

@Controller

Public class MainController(){

 

@RequestMapping("/test")    

public String testValid(@Valid User user, BindingResult result){

   

    return "test";

}

 

@RequestMapping("/test1")    

public String testValidated(@Validated User user, BindingResult result){

   

    return "test";

}

 

}

 

  • 通过嵌套 @Valid+@Valid @Valid+@Validated 注解,请求执行时会同时对 School User 中的参数进行非空和数值不为负数的验证

 

 

@Validated 分组验证

  • 分组验证,就是将通过校验注解将字段分组,分别验证。校验注解都拥有一个 groups 属性,可以设置从属不同的类来确定分组,然后将类传入 @Validated 注解选择使用验证

 

  • 首先,为了分组,可以创建两个类接口

 

public interface BasicInfo { }

 

public interface AdvanceInfo { }

 

  • 通过校验注解设置为字段设置不同的分组类,使用 @Validated 注解指定校验的组

示例

  • User.java

public class User {

 

@NotNull(groups = BasicInfo.class)

@Size(min = 4, max = 15, groups = BasicInfo.class)

private String password;

 

@NotBlank(groups = BasicInfo.class)

private String name;

 

@Min(value = 18, message = "Age should not be less than 18", groups = AdvanceInfo.class)

private int age;

 

@NotBlank(groups = AdvanceInfo.class)

private String phone;

 

// standard constructors / setters / getters / toString  

 

}

 

  • MainController.java

@Controller

Public class MainController(){

 

@Validated(BasicInfo.class)

@RequestMapping("/test")  

public String testValidated(User user, BindingResult result){

   

    return "test";

}

 

}