• 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在项目中的使用!

  • 相关阅读:
    查看进程在CPU和内存占用的命令
    Android studio 启动模拟器出现 VT-x is disabled in BIOS 以及 /dev/kvm is not found
    awk命令过滤tomcat的访日日志中IP地址
    windows 2008R2系统程序运行提示无法定位程序输入点ucrtbase.terminate
    k8s中yaml文件pod的语法(转)
    etcd和redis的比较和日常使用场景
    从gitlab或者github采用git clone和download zip的区别
    记录一次mysql查询速度慢造成CPU使用率很高情况
    USG防火墙DHCP设置保留IP地址
    让docker容器开机启动
  • 原文地址:https://www.cnblogs.com/lori/p/9088380.html
Copyright © 2020-2023  润新知