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> {@Validprivate T body;
}

这样就能嵌套验证了。

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

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

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

@Validated和@Valid使用相关推荐

  1. 面试:说说参数验证 @Validated 和 @Valid 的区别?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | blog.csdn.net/qq_276803 ...

  2. 参数验证 @Validated 和 @Valid 的区别,Java Web 开发必备。

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR-303 的一个变种),javax提供了@Valid(标准J ...

  3. Spring Validation验证框架参数验证 @Validated 和 @Valid 的区别

    参数验证 @Validated 和 @Valid 的区别 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303 规范,是标准 JSR- ...

  4. @Validated和@Valid区别:Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated...

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  5. notnull注解_参数校验注解Validated和Valid的区别,这次终于有人说清楚了

    Spring Validation验证框架对参数的验证机制提供了@Validated(Spring's JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR- ...

  6. @Validated和@Valid校验参数、级联属性、List

    @Validated和@Valid的区别 在Controller中校验方法参数时,使用@Valid和@Validated并无特殊差异(若不需要分组校验的话): @Valid:标准JSR-303规范的标 ...

  7. @Validated和@Valid的使用

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

  8. @Validated和@Valid

    @PathVariable :接收请求路径中占位符{}的值 @RequestParam : 接收请求路径中拼接的参数 @RequestBody : 接收请求数据,但是这些数据不在请求路径中的JOSN格 ...

  9. @Validated和@Valid的简单总结

    最近在javaWeb开发过程中对参数校验这块的@Validated和@Valid这两个注解的区别总是搞不懂,于是写了个Demo测试了一下. 一.对Controller层方法的参数进行校验 Contro ...

最新文章

  1. unix odbc php 连接sqlserver,Ubuntu下通过unixODBC连接MS SqlServer2005
  2. 谨慎对待switch,用Object对象替换switch
  3. aptana对齐快捷键ctrl+shift+f
  4. php pdo获取查询数据_php使用PDO获取结果集的方法
  5. [官网]Prevent a worm by updating Remote Desktop Services (CVE-2019-0708)
  6. Python连接MySQL数据库执行sql语句时的参数问题
  7. php array product,PHP array_product()用法及代码示例
  8. Eclipse热部署插件(Jrebel) 下载安装教程
  9. Spring 事务API 架构图
  10. java护照号码校验_SpringBoot如何优雅的校验参数
  11. JEECG参与2017年度最受欢迎开源项目投票,请投上宝贵一票
  12. vue调试工具 -- vue-devtools 安装方法
  13. 我的世界服务器光影文件夹,我的世界光影怎么开?中国版介绍
  14. AD9 设置网络标号作用域 (NET 全局)
  15. mpeg2是信源还是信道编码_hdb3编码到底属于信源编码还是信道编码?
  16. Tensorflow概念详解
  17. java stringbuilder_Java stringBuilder的使用方法及实例解析
  18. XXL任务调度平台+java实现定时任务
  19. 洛谷 P1490 买蛋糕 解题报告
  20. 【ZZULIOJ】1026: 字符类型判断

热门文章

  1. 芯片管脚工作在各个模式的特点和优缺点(持续更新)加上下拉电阻的作用
  2. KONG网关 — KongA管理UI使用
  3. 计算机要执行一条指令,cpu所涉及的操作应该包括下列的,计算机应用基础学习指导...
  4. 图像sensor的工作原理
  5. golang vendor介绍
  6. 五:.net core(.NET 6)使用Autofac实现依赖注入
  7. mysql数据库管理-innode undo表空间
  8. c语言编程上升沿怎样写,plc结构化编程怎么写
  9. 做好自动化运维平台需要哪些技能?
  10. Windows、Linux系统常用CMD命令大全