@Valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在API接收数据时添加@valid关键字,这时你的实体将会开启一个校验的功能,具体的代码如下,是最基本的应用:

实体:

  1. public class DepartmentDto {
  2.  
  3. @ApiModelProperty("id")
  4. private String id;
  5.  
  6. @ApiModelProperty("上级Id")
  7. private String parentId;
  8.  
  9. @ApiModelProperty("编号")
  10. @NotBlank(message = "部门编号不能为空。")
  11. private String code;
  12.  
  13. @ApiModelProperty("名称")
  14. @NotBlank(message = "部门名称不能为空。")
  15. private String name;
  1. @ApiModelProperty("员工集合")
    @Builder.Default
    private List<Employee> employees = new ArrayList<>();
  1. }

Restful接口:

  1. @PostMapping()
  2. public Response<ClientAccount> initialAccount(
  3. @ApiParam("客户编号") @PathVariable String code,
  4. @ApiParam("账期") @PathVariable YearMonth accountPeriod,
  5. @ApiParam("请求体") @Valid @RequestBody Request<DepartmentDto> request) {
  6. ClientAccount result = clientAccountService.initialAccount(
  7. code,
  8. accountPeriod,
  9. request.getOperator(),
  10. request.getBody());{}

上面代码中,我们为请求体Request<DepartmentDto>添加了校验,在测试时,如果你的DepartmnetDto.name为空字符时,当出现400的异常,丽时异常消息是『部门名称不能为空』,这对于我们来说是没有问题的,也是符合我们要求的,下面看另一个场景。

需要验证的实体是另一个实休的属性

这种方式我们也需要会看到,一个大对象,如被封装的其它小对象组成,比如部门下面有员工,这时如果需要验证员工的有效性,需要如何实现呢?如果我们不修改源代码,执行结果是否定的,它并不会校验员工这个对象,而只针对第一层对象的属性。

我们将实体的员工属性添加上@Valid即可实现对这个属性的校验

  1. public class DepartmentDto {
  2.  
  3. @ApiModelProperty("id")
  4. private String id;
  5.  
  6. @ApiModelProperty("上级Id")
  7. private String parentId;
  8.  
  9. @ApiModelProperty("编号")
  10. @NotBlank(message = "部门编号不能为空。")
  11. private String code;
  12.  
  13. @ApiModelProperty("名称")
  14. @NotBlank(message = "部门名称不能为空。")
  15. private String name;
  16.  
  17. @Valid
  18. @ApiModelProperty("员工集合")
  19. @Builder.Default
  20. private List<Employee> employees = new ArrayList<>();
  21. }

下面看一下验证结果,我们的400错误就可以在单元测试下面正常输出了!

  1. @Test
  2. public void initialAccount_employee_name_empty() {
  3. List<Employee> employees = new ArrayList<>();
  4. employees.add(Employee.builder()
  5. .name("")
  6. .email("zzl@sina.com")
  7. .idNumber("110111198203182012")
  8. .build());
  9. List<DepartmentDto> departments = new ArrayList<>();
  10. departments.add(DepartmentDto.builder()
  11. .name("部门")
  12. .description("技术部")
  13. .salaryType(SalaryType.ResearchAndDevelopmentCosts)
  14. .employees(employees)
  15. .build());
  16. ClientAccountDto clientAccountDto = ClientAccountDto.builder()
  17. .name("客户")
  18. .departments(departments)
  19. .build();
  20. Request<ClientAccountDto> request = buildRequest(clientAccountDto);
  21. api.post()
  22. .uri("/v1/12345/2018-03")
  23. .body(BodyInserters.fromObject(request))
  24. .exchange()
  25. .expectStatus().isEqualTo(400)
  26. .expectBody()
  27. .jsonPath("$.errors[0].message").isEqualTo("姓名不能为空");
  28. }

结果如下,测试通过

如果是测试它是IsOk的话,由于用户名为空,所以会出现错误提示

  1. api.post()
  2. .uri("/v1/12345/2018-03")
  3. .body(BodyInserters.fromObject(request))
  4. .exchange()
  5. .expectStatus().isOk();

可以看一下结果的提示信息

感谢各位阅读!

今天主要介绍 @Valid在项目中的使用!

springboot~@Valid注解对嵌套类型的校验的更多相关文章

  1. springboot @valid与@validated的参数校验使用总结

    好久没在这平台写博客了,最近整理了这东西,先给出总结 // @Valid只能用在controller,@Validated可以用在其他被spring管理的类上 // @Valid可以加在成员变量上(本 ...

  2. SpringMVC使用@Valid注解进行数据验证

    SpringMVC使用@Valid注解进行数据验证   from:https://blog.csdn.net/zknxx/article/details/52426771 我们在做Form表单提交的时 ...

  3. SpringBoot Validation参数校验 详解自定义注解规则和分组校验

    前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ...

  4. @Valid注解的使用springmvc pojo校验

    @Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...

  5. springboot + redis + 注解 + 拦截器 实现接口幂等性校验

    一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多 ...

  6. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    Springboot + redis + 注解 + 拦截器来实现接口幂等性校验   1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...

  7. Spring/SpringBoot常用注解总结

    转自:[Guide哥] 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使 ...

  8. SpringBoot常见注解

    0.前言 这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没 ...

  9. 菜鸟的springboot常用注解总结

    菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...

随机推荐

  1. 学会python可以上天!20行代码获取斗鱼平台房间数据,就是这么牛逼!

    Python(发音:英[?pa?θ?n],美[?pa?θɑ:n]),是一种面向对象.直译式电脑编程语言,也是一种功能强大的通用型语言,已经具有近二十年的发展历史,成熟且稳定.它包含了一组完善而且容易理 ...

  2. WeTest----如何使用WeTest进行App性能测试?

    使用Wetest可以测试手机app的性能,wetest主打游戏app测试,但是对于其余的app仍然适用,手机可以root,也可在非root的情况下进行测试, 此时可以获取的性能数据包括:FPS.整机C ...

  3. 计算机17-3,4作业C

    C.Class Degisn Description 定义一个Circle类,有成员变量(或称之为域)x,y(圆心坐标)r(圆半径),成员方法intersect()两个圆是否相交的判断方法,和所需要的 ...

  4. 常用典型的sql语句

    1.两张表,怎么把一张表中的数据插入到另一张表中? 1,insert into table_a select * from table_b 2,insert into table_a(field_a1 ...

  5. Python并发编程之初识异步IO框架:asyncio 上篇(九)

    大家好,并发编程 进入第九篇. 通过前两节的铺垫(关于协程的使用),今天我们终于可以来介绍我们整个系列的重点 -- asyncio. asyncio是Python 3.4版本引入的标准库,直接内置了对 ...

  6. 隐马尔可夫模型(HMM)总结

    摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项(算法过程,调参等注意事项) 5.实现和具体例子 6.适用场合 内容: 1.算法概述 隐马尔科夫模型(Hidden Markov ...

  7. 对Javascript 类、原型链、继承的理解

    一.序言   和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承 ...

  8. HTML 基本语法速查

    HTML 基本文档 <!DOCTYPE html> <html> <head> <title>文档标题</title> </head& ...

  9. Spark学习之编程进阶总结(二)

    五.基于分区进行操作 基于分区对数据进行操作可以让我们避免为每个数据元素进行重复的配置工作.诸如打开数据库连接或创建随机数生成器等操作,都是我们应当尽量避免为每个元素都配置一次的工作.Spark 提供 ...

  10. Java工程师必备书单

    微信公众号[程序员江湖] 作者黄小斜,斜杠青年,某985硕士,阿里 Java 研发工程师,于 2018 年秋招拿到 BAT 头条.网易.滴滴等 8 个大厂 offer,目前致力于分享这几年的学习经验. ...