2017-05-30 67 views
0

我正在设计一个用于创建新员工的REST API。Spring验证+ Swagger文档:基于其他领域的条件或值

根据员工类型,将会有必填字段,否则它们不是。例如:所有创建API调用都应该通过employeeName。但contractVendorName应该是强制性的只有employeeType=contractor

问题:

  1. 如何使用Spring的验证执行这样的限制?
  2. 如何在Swagger中记录这些字段?
  3. 如果不支持有条件的验证,是否有意义有不同的API,用于
    • createEmpoyee(ContractEmployee CE)
    • createEmpoyee(RegularEmployee重)
      在ContractEmployee对象做弹簧+招摇的注释标记contractVendorName为必填项。

这里,我已经采取了只有一个领域为例,contractVendorName。我可能有5-6个字段,根据Employee类型可选或强制。我宁愿使用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; 

} 

回答

0

您需要类级约束才能实现此目的。阅读​​

@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()); 
    } 
}