乐趣区

关于java:别再乱用了这才是-Validated-和-Valid-的真正区别

概述

  • @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

这里再来测试,会发现如下后果:

退出移动版