案例1:
@Data
public class TestValidVo implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotEmpty(message = "param不能为空")
private Integer param;
}
/**
* 这种写法参数校验未生效
*/
@PostMapping("testList1")
public R<?> testList1( @Validated @RequestBody List<TestValidVo> validVos){
System.out.println(JSONUtil.toJsonStr(validVos));
return R.ok();
}
案例2:
@Data
public class TestValidVo implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotEmpty(message = "param不能为空")
private Integer param;
}
/**
* 这种写法参数校验未生效
*/
@PostMapping("testList2")
public R<?> testList2(@Valid @RequestBody List<TestValidVo> validVos){
System.out.println(JSONUtil.toJsonStr(validVos));
return R.ok();
}
案例1和案例2是对List集合中的子元素校验,校验未生效。
案例3:
@Data
public class TestValidVo implements Serializable {
@NotNull(message = "id不能为空")
private Integer id;
@NotEmpty(message = "param不能为空")
private Integer param;
}
/**
* 校验可以生效
*/
@PostMapping("testModel1")
public R<?> testModel1(@RequestBody @Valid TestValidVo validVo){
System.out.println(JSONUtil.toJsonStr(validVo));
return R.ok();
}
案例4:
@Data
public class TestValidVo2 implements Serializable {
@NotNull(message = "id不能为空")
private String id;
// 注意:这儿使用 import org.hibernate.validator.constraints.NotEmpty 而不是javax.validation.constraints.NotEmpty,
// 使用javax.validation.constraints.NotEmpty会报错:javax.validation.UnexpectedTypeException:
// HV000030: No validator could be found for constraint 'javax.validation.constraints.NotEmpty' validating type 'java.lang.String'.
@NotEmpty(message = "param不能为空")
private String param;
}
/**
* 校验可以生效
* 这块是要注意使用注释时org.hibernate.validator.constraints.NotEmpty 而不是javax.validation.constraints.NotEmpty
*/
@PostMapping("testModel2")
public R<?> testModel2(@RequestBody @Valid TestValidVo2 validVo){
System.out.println(JSONUtil.toJsonStr(validVo));
return R.ok();
}
案例5:
/**
* 校验可以生效
* 注解 @Valid 和 @Validated 都可以生效
*/
@PostMapping("testModel3")
public R<?> testModel3(@RequestBody @Validated TestValidVo2 validVo){
System.out.println(JSONUtil.toJsonStr(validVo));
return R.ok();
}
案例3和案例4对子类直接校验,可以生效。
案例4是为了说明使用NotEmpty注释时,注意使用org.hibernate.validator.constraints.NotEmpty而不是javax.validation.constraints.NotEmpty。
案例3和案例5对比,说明在修饰方法参数时,@Valid和@Validated效果时一致的。
案例6:
@Data
public class TestValidListVo implements Serializable {
private List<TestValidVo> validVos;
}
/**
* 校验不生效
*/
@PostMapping("testList3")
public R<?> testList3(@RequestBody @Valid TestValidListVo validListVo){
System.out.println(JSONUtil.toJsonStr(validListVo));
return R.ok();
}
案例7:
@Data
public class TestValidList4Vo implements Serializable {
@Valid
private List<TestValidVo> validVos;
}
/**
* 校验可以生效
*/
@PostMapping("testList4")
public R<?> testList4(@RequestBody @Valid TestValidList4Vo validListVo){
System.out.println(JSONUtil.toJsonStr(validListVo));
return R.ok();
}
案例6和案例7是属于嵌套验证,案例6没有在成员属性list上添加@Valid修饰,校验未生效。
案例7在成员属性list上添加了@Valid,最后校验生效