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

实体:

public class DepartmentDto {

  @ApiModelProperty("id")
private String id; @ApiModelProperty("上级Id")
private String parentId; @ApiModelProperty("编号")
@NotBlank(message = "部门编号不能为空。")
private String code; @ApiModelProperty("名称")
@NotBlank(message = "部门名称不能为空。")
private String name;
 @ApiModelProperty("员工集合")
@Builder.Default
private List<Employee> employees = new ArrayList<>();
}

Restful接口:

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

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

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

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

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

public class DepartmentDto {

  @ApiModelProperty("id")
private String id; @ApiModelProperty("上级Id")
private String parentId; @ApiModelProperty("编号")
@NotBlank(message = "部门编号不能为空。")
private String code; @ApiModelProperty("名称")
@NotBlank(message = "部门名称不能为空。")
private String name; @Valid
@ApiModelProperty("员工集合")
@Builder.Default
private List<Employee> employees = new ArrayList<>();
}

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

 @Test
public void initialAccount_employee_name_empty() {
List<Employee> employees = new ArrayList<>();
employees.add(Employee.builder()
.name("")
.email("zzl@sina.com")
.idNumber("110111198203182012")
.build());
List<DepartmentDto> departments = new ArrayList<>();
departments.add(DepartmentDto.builder()
.name("部门")
.description("技术部")
.salaryType(SalaryType.ResearchAndDevelopmentCosts)
.employees(employees)
.build());
ClientAccountDto clientAccountDto = ClientAccountDto.builder()
.name("客户")
.departments(departments)
.build();
Request<ClientAccountDto> request = buildRequest(clientAccountDto);
api.post()
.uri("/v1/12345/2018-03")
.body(BodyInserters.fromObject(request))
.exchange()
.expectStatus().isEqualTo(400)
.expectBody()
.jsonPath("$.errors[0].message").isEqualTo("姓名不能为空");
}

结果如下,测试通过

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

 api.post()
.uri("/v1/12345/2018-03")
.body(BodyInserters.fromObject(request))
.exchange()
.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. Tensorflow学习-数据读取

    Tensorflow数据读取方式主要包括以下三种 Preloaded data:预加载数据 Feeding: 通过Python代码读取或者产生数据,然后给后端 Reading from file: 通 ...

  2. bzoj 3195 奇怪的道路 状压dp

    看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制, ...

  3. laravel 查询数据返回的结果

    laravel查询数据返回的结果 在插入数据库的时候,发现查询数据返回的结果是一个对象;即使是空数据 返回的不是true或者false 那么要判断该结果是否查询有结果 该如果呢? 学习源头: http ...

  4. python--装饰器(附偏函数、断言)

    博客地址:http://www.cnblogs.com/yudanqu/ 概念:装饰器是一个闭包,把一个函数当做参数返回一个替代版的函数,本质上就是一个返回函数的函数 装饰器就是在我们需要的一个函数外 ...

  5. python selenium中Excel数据维护(二)

    接着python里面的xlrd模块详解(一)中我们我们来举一个实例: 我们来举一个从Excel中读取账号和密码的例子并调用: ♦1.制作Excel我们要对以上输入的用户名和密码进行参数化,使得这些数据 ...

  6. eclipse使用Git基本流程

    1.安装GIT 2.Git的使用 ①下载代码到eclipse(右键导入工程) ②提交代码到本地(commit) ③更新代码到本地(pull) ④当本地出现冲突时,解决冲突,没有冲突当然就最好啦 ⑤提交 ...

  7. 使用Entity Framework Core访问数据库(Oracle篇)

    前言 哇..看看时间 真的很久很久没写博客了 将近一年了. 最近一直在忙各种家中事务和公司的新框架  终于抽出时间来更新一波了. 本篇主要讲一下关于Entity Framework Core访问ora ...

  8. 干货,一文带你超详细了解Session的原理及应用

    session 简介 session 是我们 jsp 九大隐含对象的一个对象. session 称作域对象,他的作用是保存一些信息,而 session 这个域对象是一次会话期间使用同一个对象.所以这个 ...

  9. 性能测试入门 — LoadRunner 使用初探

    前言: 性能测试是利用产品.人员和流程来降低应用程序.升级程序或补丁程序部署风险的一种手段.性能测试的主要思想是通过模拟产生真实业务的压力对被测系统进行加压,验证被测系统在不同压力情况下的表现,找出其 ...

  10. pandas和spark的dataframe互转

    pandas的dataframe转spark的dataframe from pyspark.sql import SparkSession # 初始化spark会话 spark = SparkSess ...