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

 

posted @ 2020-11-25 16:06  T1anXu  阅读(625)  评论(0)    收藏  举报