概述
- @Valid 是应用 Hibernate validation 的时候应用
- @Validated 是只用 Spring Validator 校验机制应用
阐明:java 的 JSR303 申明了 @Valid 这类接口,而 Hibernate-validator 对其进行了实现
@Validation 对 @Valid 进行了二次封装,在应用上并没有区别,但在分组、注解地位、嵌套验证等性能上有所不同,这里次要就这几种状况进行阐明。
注解地位
- @Validated:用在类型、办法和办法参数上。但不能用于成员属性(field)
- @Valid:能够用在办法、构造函数、办法参数和成员属性(field)上
如:
如果 @Validated 注解在成员属性上,则会报不适用于 field 谬误
分组校验
- @Validated:提供分组性能,能够在参数验证时,依据不同的分组采纳不同的验证机制
- @Valid:没有分组性能
举例:
定义分组接口:
public interface IGroupA {
定义须要测验的参数 bean:
public class StudentBean implements Serializable{
测试代码:
测验分组为 IGroupA 的状况
@RestController
测试:
这里对分组 IGroupB 的就没测验了
如果把测试代码改成上面这样,看看测试后果
@RestController
阐明:
1、不分 配 groups,默认每次都要进行验证
2、对一个参数须要多种验证形式时,也可通过调配不同的组达到目标。
组序列
默认状况下 不同级别的束缚验证是无序的,然而在一些状况下,程序验证却是很重要。
一个组能够定义为其余组的序列,应用它进行验证的时候必须合乎该序列规定的程序。在应用组序列验证的时候,如果序列前边的组验证失败,则前面的组将不再给予验证。
举例:
定义组序列:
@GroupSequence({Default.class, IGroupA.class, IGroupB.class})
须要校验的 Bean,别离定义 IGroupA 对 age 进行校验,IGroupB 对 className 进行校验:
public class StudentBean implements Serializable{
测试代码:
@RestController
测试发现,如果 age 出错,那么对组序列在 IGroupA 后的 IGroupB 不进行校验,即例子中的 className 不进行校验,后果如下:
嵌套校验
一个待验证的 pojo 类,其中还蕴含了待验证的对象,须要在待验证对象上注解 @Valid,能力验证待验证对象中的成员属性,这里不能应用 @Validated。
举例:
须要束缚校验的 bean:
public class TeacherBean {
public class StudentBean implements Serializable{
留神:
这里对 teacherBeans 只校验了 NotNull, 和 Size,并没有对 teacher 信息外面的字段进行校验,具体测试如下:
这里 teacher 中的 type 显著是不合乎束缚要求的,然而能检测通过,是因为在 student 中并没有做 嵌套校验
能够在 teacherBeans 中加上 @Valid,具体如下:
@Valid
这里再来测试,会发现如下后果: