java - Spring 验证 + Swagger 文档 : Based on conditions or values of other fields

标签 java spring swagger

我正在设计一个 REST API 来创建新员工。

根据员工类型,有些字段是必填的,否则不是。 例如:所有创建 API 调用都应传递 employeeName。但仅当 employeeType=contractor

时,contractVendorName 才应该是强制性的

问题:

  1. 如何使用 Spring Validations 强制实现此类限制?
  2. 如何在 Swagger 中记录此类字段?
  3. 如果不支持条件验证,那么使用不同的 API 是否有意义
    • createEmpoyee(ContractEmployee ce)
    • createEmpoyee(RegularEmployee re)
      在 ContractEmployee 对象中使用 spring+swagger 注释将 contractVendorName 标记为强制。

这里我只以一个字段为例,contractVendorName。我可能有 5-6 个字段,根据员工类型,这些字段是可选的或必填的。我更喜欢使用 spring 验证,这样我就不必编写样板代码来自己检查所有验证。多个员工类型对象的副作用是 API 的增加。因为每种对象类型都需要一个单独的 API。

关于拥有单独的对象+更多 API 与自 API 和一个包含所有字段的对象并根据员工类型对每个字段进行手动验证的方法有什么好的建议吗?

public class EmployeeDTO {

      /**
       * Employee Type: full-time, part-time, permanent, contractor
       */
      @NotNull
      @ApiModelProperty(required = true)
      private String employeeType;

      /**
       * Mandatory field that is to be given by client 
       */
      @NotBlank
      @ApiModelProperty(required = true)
      private String employeeName;


      /**
       * How to make this field mandatory when employeeType =  contractor ?
       * Is this possible in Spring?
       * How to document it in Swagger?
       */
      private String contractVendorName;

}

最佳答案

您需要类级别约束来实现此目的。阅读 here

@Target({ TYPE, ANNOTATION_TYPE })
@Retention(RUNTIME)
@Constraint(validatedBy = { VendorNameCheckValidator.class })
@Documented
public @interface VendorNameCheck {

    String message() default "{some.message}";

    Class<?>[] groups() default { };

    Class<? extends Payload>[] payload() default { };
}



public class VendorNameCheckValidator
        implements ConstraintValidator<ValidPassengerCount, EmployeeDTO> {

    @Override
    public void initialize(VendorNameCheck constraintAnnotation) {
    }

    @Override
    public boolean isValid(EmployeeDTO dto, ConstraintValidatorContext context) {
        if ( dto == null ) {
            return true;
        }

        return !"contractor".equals(dto.getEmployeeType()) || isNotEmpty(dto.getContractVendorName());
    }
}

关于java - Spring 验证 + Swagger 文档 : Based on conditions or values of other fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44270007/

相关文章:

java - 如果我有一天的特定日期,我如何获得前一周的那一天的日期?

java - Spring Boot - 使用自定义对象数组 JSON 序列化自定义对象

spring-boot 以 Apache 和 AJP 为前端

java - Box v2 API java 示例,无需用户交互

java - 预期 Mockito 测试异常

java - 将 html 字符替换为 ""(空白)并将样式应用于其中的文本

java - 在eclipse中的另一个用户库中添加用户库

JSON 到蓝图/MSON

f# - 在使用 Swagger Type Provider 时,我应该怎么做才能防止出现 401 Unauthorized?

asp.net-core - 在反向代理后面运行时,使用端口 80 进行 https 的 Swashbuckle