欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

springboot @Valid注解对嵌套类型的校验功能

程序员文章站 2023-12-19 10:23:34
@valid注解可以实现数据的验证,你可以定义实体,在实体的属性上添加校验规则,而在api接收数据时添加@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("姓名不能为空");
 }

 结果如下,测试通过

springboot @Valid注解对嵌套类型的校验功能 

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

api.post()
    .uri("/v1/12345/2018-03")
    .body(bodyinserters.fromobject(request))
    .exchange()
    .expectstatus().isok();

springboot @Valid注解对嵌套类型的校验功能 

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

springboot @Valid注解对嵌套类型的校验功能 

总结

以上所述是小编给大家介绍的springboot @valid注解对嵌套类型的校验,希望对大家有所帮助

上一篇:

下一篇: