openapi 3.0 有效的最小值和最大值

Sri*_*har 8 java codegen openapi openapi-generator

我的 openapi 合约中有以下模式定义来表示commission amount

commissionAmount:
  type: number
  minimum: -99999.99
  maximum: 99999.99
Run Code Online (Sandbox Code Playgroud)

生成的代码:

@Valid
@DecimalMin("-99999.99") @DecimalMax("99999.99") 
public BigDecimal getCommissionAmount() {
  return commAmt;
}
Run Code Online (Sandbox Code Playgroud)

生成的代码很好并且符合预期。我只是想知道这些-99999.99以及和99999.99的有效值。minimummaximum

提出这个问题的原因是它没有检查小数部分的限制。例如,我期望12345.678is invalid ,12345.67is valid 。但它将两者标记为有效。

I read@Digits用于检查整数和小数部分的位数限制。我如何告诉也openapi-generator-maven-plugin进行注释?Digits

预期生成的代码:

@Valid
@Digits(integer = 5, fraction = 2)
@DecimalMin("-99999.99") @DecimalMax("99999.99") 
public BigDecimal getCommissionAmount() {
  return commAmt;
}
Run Code Online (Sandbox Code Playgroud)

Kno*_*nox 9

在 OpenAPI 中指定这一点的方法是使用multipleOf

commissionAmount:
  type: number
  minimum: -99999.99
  maximum: 99999.99
  multipleOf: 0.01
Run Code Online (Sandbox Code Playgroud)

但是,使用 OpenAPI 生成器不会为此生成注释。原因是没有javax.validation可以有效表示的注释multipleOf(想象一下尝试表达multipleOf: 0.02-@Digits是不够的)。

但是,您可以像该用户一样创建自己的注释:https://github.com/OpenAPITools/openapi-generator/issues/2192#issuecomment-575132233

使用以下注释和验证器:

@Target({METHOD, FIELD})
@Retention(RUNTIME)
@Repeatable(MultipleOf.List.class)
@Constraint(validatedBy = MultipleOfValidator.class)
public @interface MultipleOf {

    double value();

    String message() default "{error.multipleOf}";

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

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

    @Target({ METHOD, FIELD })
    @Retention(RUNTIME)
    @Documented
    @interface List {
        MultipleOf[] value();
    }

}
Run Code Online (Sandbox Code Playgroud)
public class MultipleOfValidator implements ConstraintValidator<MultipleOf, Number> {

    private double value;

    @Override
    public void initialize(MultipleOf constraintAnnotation) {
        this.value = constraintAnnotation.value();
    }

    @Override
    public boolean isValid(Number value, ConstraintValidatorContext context) {
        return (value == null) || (value.doubleValue() / this.value) % 1 == 0;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后,您可以分叉生成器并将新注释添加到模板中:https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/Java/ beanValidationCore.mustache

像这样的一行:

{{#multipleOf}}@MultipleOf({{multipleOf}}){{/multipleOf}}
Run Code Online (Sandbox Code Playgroud)