概述使用Hibernate验证时使用@Valid@Validated只是SpringValidator验证机制使用说明:Java的JSR303声明了@Valid等接口,Hibernate-validator实现了@Validation是对@Valid进行了二次封装,并且使用上没有区别,只是在分组、注解位置、嵌套校验等功能上有所区别。这里主要说明这几种情况。注解位置@Validated:用在类型、方法和方法参数上。但它不能用于成员属性(字段)@Valid:它可以用于方法、构造函数、方法参数和成员属性(字段)。例如:@Validated注解在成员属性上,会报不适用于字段错误组校验Validation@Validated:提供分组功能,参数校验时可以根据不同的分组使用不同的校验机制@Valid:无分组功能示例:定义分组接口:publicinterfaceIGroupA{定义需要验证的参数bean:publicclassStudentBeanimplementsSerializable{测试代码:查看分组为IGroupA的情况@RestController测试:这里分组IGroupB为未测试如果将测试代码改成如下,看测试结果@RestController说明:1.不分配分组,默认每次都要进行Verification。2.当一个参数需要多种验证方法时,也可以通过分配不同的组来达到目的。GroupSequence默认情况下,不同级别的约束验证是无序的,但在某些情况下顺序验证很重要。一个组可以定义为其他组的序列,当用于验证时,必须符合该序列规定的顺序。使用组序列校验时,如果序列前面的组校验失败,后面的组将不再校验。示例:定义组序:@GroupSequence({Default.class,IGroupA.class,IGroupB.class})需要验证的Bean,分别定义IGroupA验证年龄,IGroupB验证className:publicclassStudentBeanimplementsSerializable{Test代码:@RestController测试发现,如果年龄不对,则不会对group序号在IGroupA之后的IGroupB进行校验,即不对示例中的className进行校验,结果如下:嵌套校验的要验证的pojo类,其中还包含要验证的对象。需要在待验证对象上注解@Valid,以验证待验证对象中的成员属性。@Validated不能在这里使用。示例:一个需要约束校验的bean:publicclassTeacherBean{publicclassStudentBeanimplementsSerializable{注:这里只校验teacherBeans的NotNull,Size,不校验teacher信息中的字段。具体测试如下:这里teacher中的type明显不满足约束要求,但是由于student中没有嵌套验证,所以可以通过测试。可以给teacherBeans加上@Valid,如下:@Valid这里再测试一下,会发现如下结果:
