Spring表单校验@Validated、@Valid
0. @Valid 和 @Validated对比
@Validated:可以用在类、方法和方法参数上。
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
1. @Valid
(1)简单使用
① 通过在DTO 中的属性上使用验证注解,如@Max,@Min,@NotNull,@NotEmpty等注解,在Controller层,或Service层的方法参数上使用@Valid注解对DTO bean做表单验证
②全局地做异常处理,否则通过BindingResult bean来接收校验失败的反馈信息(异常)。
2. @Validated
(1)分组 groups
①在DTO的属性上使用注解进行校验,并且添加组别,如:
@NotNull(groups = {OnCreate.class, OnUpdate.class}),@Size(min = 1, max = 3, groups = {OnCreate.class})
②然后在Controller/Service层的方法参数上使用@Validated({OnCreate.class, OnUpdate.class})对DTO bean 进行校验,注意,{}中多项内容表示需要对多种组别进行验证
③分组如何定义:
public interface OnCreate{ }
(2)可继承的分组定义
public interface Default{ }
public interface OnCreate extends Default{ }
public class DTO{ @NotBlank(groups = {Default.class}) private String name; @NotBlank(groups = {OnCreate.class}) private String address; }
当使用@Validated(Deault.class)时,只会验证name属性,但不会验证address;当使用@Validated(OnCreate.class),既会验证address,也会验证name
当OnCreate接口继承Default接口时,相当于使对于OnCreate.class组别的验证增加Default组别的验证
(3)组别序列
对于一个DTO的验证中,可能存在多种层次的验证,某些验证的优先级更高,或者希望先验证耗时短的。
因此,可以对多个层次的验证组别分别定义,然后通过@GroupSequence注解对组进行排序
public interface First{ } public interface Second{ } @GroupSequence({First.class, Second.class}) public interface Group{ }
public class DTO{ @NotNull(groups = {First.class}) private Long id; @NotNull(groups = {First.class}) @Length(min = 2, max = 4,groups = {Second.class}) private String name; }
在Controller层添加@Validated(Group.class)既可以完成对id和name的校验,同时保证先校验First.class组,再校验Second.class组。
3. 使用@Validated和@Valid进行嵌套DTO的验证
当一个DTO中嵌套包含了另一个DTO2时,想要对DTO2进行内部的验证,光使用@Validated或@Valid中的一种是无法做到的,需要两者配合使用
public class DTO{ @NotBlank private String name; @Valid //通过添加@Valid 来对内部属性进行验证 @NotNull //此NotNull只能针对dto2这个对象进行验证,无法对其内部属性进行验证 private DTO2 dto2; } public class DTO2{ @NotNull private Integer value; }
因为还未写demo验证,关于嵌套验证,更多信息参考:https://blog.csdn.net/qq_27680317/article/details/79970590

浙公网安备 33010602011771号