我正在设计一个 REST API 来创建新员工。
根据员工类型,有些字段是必填的,否则不是。
例如:所有创建 API 调用都应传递 employeeName
。但仅当 employeeType=contractor
contractVendorName
才应该是强制性的
问题:
- 如何使用 Spring Validations 强制实现此类限制?
- 如何在 Swagger 中记录此类字段?
- 如果不支持条件验证,那么使用不同的 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/