我们使用 Java 11 和以下版本的 Swagger Codegen
<plugin>
<groupId>io.swagger.codegen.v3</groupId>
<artifactId>swagger-codegen-maven-plugin</artifactId>
<version>3.0.35</version>
我的 OpenAPI 3 规范中针对特定 DTO 字段有此内容,
amount:
type: number
format: double
maximum: 99999999.99
multipleOf: 0.01
运行插件后,生成的 DTO 不带小数位
/**
* Get amount
* maximum: 99999999
* @return amount
**/
@Schema(required = true, description = "")
@NotNull
@DecimalMax("99999999") public Double getAmount() {
return amount;
}
因此,当我提交列出的最大值 99999999.99 时,我收到此错误
"errorMessage": "must be less than or equal to 99999999"
openAPI 规范和 Swagger 代码生成中拥有最大字段并随后包含小数位的正确方法是什么?
你能试试这个吗?
amount:
type: number
format: double
exclusiveMaximum: 100000000
multipleOf: 0.01
尝试基于双精度格式(我知道 DTO 不会生成小数),将其添加到 pom.xml 中的 swagger-codegen-maven-plugin 配置中:
<configuration>
<typeMappings>
<typeMapping>Double=java.math.BigDecimal</typeMapping>
</typeMappings>
</configuration>
[SwaggerV3] 这段代码就是这样做的。 默认CodegenConfing.java
他们将最小值和最大值视为长值。
您可以修改和创建您自己的版本或扩展它以创建您自己的生成器。 那么你需要类似的东西:
@Override
protected void processPropertySchemaTypes(String name, CodegenProperty codegenProperty, Schema propertySchema) {
super.processPropertySchemaTypes(name, codegenProperty, propertySchema);
reprocessNumberMinAndMax(propertySchema, codegenProperty);
}
private void reprocessNumberMinAndMax(Schema propertySchema, CodegenProperty codegenProperty){
if (propertySchema instanceof NumberSchema) {
if (propertySchema.getMinimum() != null) {
codegenProperty.minimum = String.valueOf(propertySchema.getMinimum());
}
if (propertySchema.getMaximum() != null) {
codegenProperty.maximum = String.valueOf(propertySchema.getMaximum());
}
}
}