@Validated和@Valid使用

Spring Validation验证框架对参数的验证机制提供了@Validated(Spring’s JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果。

使用@Validated或者@Valid在基本验证功能上没有太多区别。但是在分组、注解地方、嵌套验证等功能上两个有所不同:

  1. 分组
    @Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制。@Valid:作为标准JSR-303规范,还没有吸收分组的功能。

  2. 注解地方
    @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
    @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
    两者是否能用于成员属性(字段)上直接影响能否提供嵌套验证的功能。

  3. 嵌套验证
    在比较两者嵌套验证时,先说明下什么叫做嵌套验证。
    比如一个统一的接收类

@Data
public class CommonRequest<T> {
	
    private T body;
}

body是其他vo或者dto什么的,比如:

@Data
public class DepartmentVo {

    @NotBlank(message = "操作失败!未获取到部门ID", groups = {Delete.class, Update.class})
    private String departmentId;
    @NotBlank(message = "部门名称不能为空", groups = {Save.class, Update.class})
    private String departmentName;
    @NotBlank(message = "助记码不能为空", groups = {Save.class, Update.class})
    private String mnemonicCode;
    @NotBlank(message = "部门编号不能为空", groups = {Save.class, Update.class})
    private String code;
    @NotBlank(message = "部门等级不能为空", groups = {Save.class, Update.class})
    private String level;
    @NotBlank(message = "负责人不能为空", groups = {Save.class, Update.class})
    private String master;
    private String descript;
    private Byte status;

    public interface Save{}
    public interface Update{}
    public interface Delete{}
}

CommonRequest里body属性这个实体也有自己的验证机制。
这样,如果在Controller的入参加上@Validated或者@Valid

public void doSaveDepartment(@Validated(DepartmentVo.Save.class) @RequestBody CommonRequest<DepartmentVo> commonRequest){
	// ...
}

Spring Validation框架只会对最外层的CommonRequest的字段做校验,不会对body里的字段实体进行校验。

为了能够进行嵌套验证,必须手动在CommonRequest实体的body字段上明确指出这个字段里面的实体也要进行验证。由于@Validated不能用在成员属性(字段)上,但是@Valid能加在成员属性(字段)上,而且@Valid类注解上也说明了它支持嵌套验证功能,那么我们能够推断出:@Valid加在方法参数时并不能够自动进行嵌套验证,而是用在需要嵌套验证类的相应字段上,来配合方法参数上@Validated@Valid来进行嵌套验证。

修改CommonRequest类如下:

@Data
public class CommonRequest<T> {

	@Valid
    private T body;
}

这样就能嵌套验证了。

@Validated和@Valid在嵌套验证功能上的区别:

@Validated:用在方法入参上无法单独提供嵌套验证功能。不能用在成员属性(字段)上,也无法提示框架进行嵌套验证能配合嵌套验证注解@Valid进行嵌套验证

@Valid:用在方法入参上无法单独提供嵌套验证功能。能够用在成员属性(字段)上,提示验证框架进行嵌套验证能配合嵌套验证注解@Valid进行嵌套验证

你可能感兴趣的:(注解)