OpenAPI 3.0 действительные минимальные и максимальные значения - PullRequest
1 голос
/ 23 марта 2020

Ниже приведено определение схемы для представления commission amount в моем контракте openapi.

commissionAmount:
  type: number
  minimum: -99999.99
  maximum: 99999.99

Сгенерированный код:

@Valid
@DecimalMin("-99999.99") @DecimalMax("99999.99") 
public BigDecimal getCommissionAmount() {
  return commAmt;
}

Сгенерированный код работает правильно и, как и ожидалось. Я просто хотел знать, являются ли эти -99999.99 и 99999.99 действительными значениями для minimum и maximum.

Причина, по которой этот вопрос задается, заключается в том, что он не проверяет ограничение в дробной части. Например, я ожидаю, что 12345.678 недействительно, 12345.67 допустимо. Но он помечает оба значения как действительные.

Я читаю @Digits используется для проверки предела di git для целой и дробной частей. Как мне сказать openapi-generator-maven-plugin также аннотировать Digits?

Ожидаемый сгенерированный код:

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

1 Ответ

0 голосов
/ 29 марта 2020

Способ указать это в OpenAPI будет использовать multipleOf:

commissionAmount:
  type: number
  minimum: -99999.99
  maximum: 99999.99
  multipleOf: 0.01

Однако использование OpenAPI Generator не даст для этого аннотацию . Причина в том, что нет javax.validation аннотации, которая могла бы эффективно представлять multipleOf (представьте, что попытки express 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();
    }

}
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;
    }

}

После этого вы сможете раскошелиться генератора и добавьте новую аннотацию к шаблону: https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/resources/Java/beanValidationCore.mustache

с такой строкой:

{{#multipleOf}}@MultipleOf({{multipleOf}}){{/multipleOf}}
...