springboot~@Valid注解对嵌套类型的校验
@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注解对嵌套类型的校验的更多相关文章
- springboot @valid与@validated的参数校验使用总结
好久没在这平台写博客了,最近整理了这东西,先给出总结 // @Valid只能用在controller,@Validated可以用在其他被spring管理的类上 // @Valid可以加在成员变量上(本 ...
- SpringMVC使用@Valid注解进行数据验证
SpringMVC使用@Valid注解进行数据验证 from:https://blog.csdn.net/zknxx/article/details/52426771 我们在做Form表单提交的时 ...
- SpringBoot Validation参数校验 详解自定义注解规则和分组校验
前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ...
- @Valid注解的使用springmvc pojo校验
@Valid注解用于校验,所属包为:javax.validation.Valid. ① 首先需要在实体类的相应字段上添加用于充当校验条件的注解,如:@Min,如下代码(age属于User类中的属性): ...
- springboot + redis + 注解 + 拦截器 实现接口幂等性校验
一.概念 幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如: 订单接口, 不能多次创建订单 支付接口, 重复支付同一笔订单只能扣一次钱 支付宝回调接口, 可能会多 ...
- Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
Springboot + redis + 注解 + 拦截器来实现接口幂等性校验 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...
- Spring/SpringBoot常用注解总结
转自:[Guide哥] 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使 ...
- SpringBoot常见注解
0.前言 这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使用 SpringBoot 来开发项目基本没 ...
- 菜鸟的springboot常用注解总结
菜鸟的springboot常用注解总结 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用 ...
随机推荐
- 开机出现loading (hd0)/ntldr。。。
电脑一开机就出现ntldr is missing的原因:1.操作系统文件损坏.2.MBR表损坏.3.硬盘数据线松了.4.硬盘坏了.解决方法:1.重新安装操作系统.2.用U盘或光盘引导,进入PE系统,用 ...
- MySQL 大表优化方案
当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...
- BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元
BZOJ_3503_[Cqoi2014]和谐矩阵_高斯消元 题意: 我们称一个由0和1组成的矩阵是和谐的,当且仅当每个元素都有偶数个相邻的1.一个元素相邻的元素包括它本身,及他上下左右的4个元素(如果 ...
- BZOJ_3427_Poi2013 Bytecomputer_DP
BZOJ_3427_Poi2013 Bytecomputer_DP Description 给定一个{-1,0,1}组成的序列,你可以进行x[i]=x[i]+x[i-1]这样的操作,求最少操作次数使其 ...
- 关于linux下部署JavaWeb项目,nginx负责静态资源访问,tomcat负责处理动态请求的nginx配置
1.项目的运行环境 linux版本 [root@localhost ~]# cat /proc/version Linux version -.el6.x86_64 (mockbuild@x86-.b ...
- 开源方案搭建可离线的精美矢量切片地图服务-2.PostGIS+GeoServer矢量切片
项目成果展示(所有项目文件都在阿里云的共享云虚拟主机上,访问地图可以会有点慢,请多多包涵). 01:中国地图:http://test.sharegis.cn/mapbox/html/3china.ht ...
- validatebox相关验证
$(document).ready( function(){ $.extend($.fn.validatebox.defaults.rules, { minLength: { validator: f ...
- redis基本类型以及优点特性
1.什么是redis? redis是一个基于内存的高性能key-value数据库 2.redis基本数据类型及应用场景 支持多种数据类型: string(字符串) String数据结构是简单的k ...
- 【官网翻译】性能篇(四)为电池寿命做优化——使用Battery Historian分析电源使用情况
前言 本文翻译自“为电池寿命做优化”系列文档中的其中一篇,用于介绍如何使用Battery Historian分析电源使用情况. 中国版官网原文地址为:https://developer.android ...
- 《HelloGitHub》第 32 期
公告 新加入了 2 位机器学期的小伙伴负责机器学习专栏.项目的首页增加合作组织一栏,如有开源组织有意合作可以点击联系我. 我们还在路上,不停地前行. <HelloGitHub>第 32 期 ...