- Spring Validation验证框架对参数的验证机制提供了@Validated,在检验Controller的入参是否符合规范时,使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同
- @Valid可以用在方法、构造函数、方法参数和成员属性上
是使用Hibernate validation的时候使用
用在方法入参上无法单独提供嵌套验证功能。提示验证框架进行嵌套验证。
能配合嵌套验证注解@Valid进行嵌套验证。
- @Validated可以用在类型、方法和方法参数上。但是不能用在成员属性上
是只用Spring Validator校验机制使用
用在方法入参上无法单独提供嵌套验证功能。无法提示框架进行嵌套验证。
能配合嵌套验证注解@Valid进行嵌套验证。
参数 |
描述 |
value |
指定一个class或多个class验证组以应用于此批注启动的验证步骤 |
参数的校验
- 以下注解用于配合@Valid,@Valided注解,使用在实体类对象参数上
- 全部参数校验如下:
空检查 |
描述 |
@Null |
验证对象是否为null |
@NotNull |
验证对象是否不为null, 无法查检长度为0的字符串 |
@NotBlank |
检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. |
@NotEmpty |
检查约束元素是否为NULL或者是EMPTY. |
Booelan检查 |
描述 |
@AssertTrue |
验证 Boolean 对象是否为 true |
@AssertFalse |
验证 Boolean 对象是否为 false |
长度检查 |
描述 |
@Size(min=, max=) |
验证对象(Array,Collection,Map,String)长度是否在给定的范围之内 |
@Length(min=, max=) |
验证注解的元素值长度在min和max区间内 |
日期检查 |
描述 |
@Past |
验证 Date 和 Calendar 对象是否在当前时间之前 |
@Future |
验证 Date 和 Calendar 对象是否在当前时间之后 |
@Pattern |
验证 String 对象是否符合正则表达式的规则 |
数值检查 |
描述 |
@Min(value=””) |
验证 Number 和 String 对象是否大等于指定的值 |
@Max(value=””) |
验证 Number 和 String 对象是否小等于指定的值 |
@DecimalMax(value=值) |
被标注的值必须不大于约束中指定的最大值. 这个约束的参数是一个通过BigDecimal定义的最大值的字符串表示.小数存在精度 |
@DecimalMin(value=值) |
被标注的值必须不小于约束中指定的最小值. 这个约束的参数是一个通过BigDecimal定义的最小值的字符串表示.小数存在精度 |
@Digits |
验证 Number 和 String 的构成是否合法 |
@Digits(integer=,fraction=) |
验证字符串是否是符合指定格式的数字,interger指定整数精度,fraction指定小数精度。 |
@Range(min=, max=) |
检查数字是否介于min和max之间. |
@Range(min=10000,max=50000, message=”range.bean.wage”) |
@Valid 递归的对关联对象进行校验, 如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验.(是否进行递归验证) |
@CreditCardNumber |
信用卡验证 |
|
验证是否是邮件地址,如果为null,不进行验证,算通过验证。 |
@ScriptAssert(lang=,script=, alias=) |
|
@URL(protocol=,host=,port=,regexp=, flags=) |
|
示例
public class User {
@NotNull(message = "uid不能为空")
private int uid;
@NotNull(message = "age不能为空")
private int age;
}
注
建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单值为“”时无法转换为int,但可以转换为Stirng为“”,Integer为null
使用 @Valid / @Validated 校验参数
- @Valid和@Validated必需使用在以@RequestBody接收参数的情况下。
示例
@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;
}
- User.java
public class User {
@NotNull(message = "uid不能为空")
private int uid;
@NotNull(message = "age不能为空")
private int age;
@NotNull(message = "age不能为空")
private School school;
}
- MainController.java
@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 中的参数进行非空和数值不为负数的验证
|