You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swagger CodeGen中如何指定带小数位的字段最大值并正确生成验证?

解决Swagger CodeGen生成带小数位最大值注解丢失问题

问题场景

使用Java 11,搭配版本3.0.35的io.swagger.codegen.v3:swagger-codegen-maven-plugin插件,在OpenAPI 3规范中为DTO的amount字段配置如下:

amount:
  type: number
  format: double
  maximum: 99999999.99
  multipleOf: 0.01

但插件生成的DTO代码中,@DecimalMax注解的最大值丢失了小数位,变成了99999999:

/**
 * 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"。

可行解决方案

1. 升级Swagger CodeGen插件版本

3.0.35版本存在数值格式化bug,后续版本(如3.0.40及以上)已修复该问题。修改Maven插件配置,更新版本号:

<plugin>
  <groupId>io.swagger.codegen.v3</groupId>
  <artifactId>swagger-codegen-maven-plugin</artifactId>
  <version>3.0.40</version>
  <!-- 其他配置项 -->
</plugin>

重新执行代码生成命令,@DecimalMax注解会正确保留小数位:@DecimalMax("99999999.99")。

2. 在OpenAPI规范中添加自定义注解扩展

如果无法升级插件,可通过OpenAPI的x-java-annotations扩展手动指定注解,强制生成正确的@DecimalMax值:

amount:
  type: number
  format: double
  maximum: 99999999.99
  multipleOf: 0.01
  x-java-annotations:
    - "@DecimalMax(value = \"99999999.99\")"

插件生成代码时会直接引入该自定义注解,覆盖自动生成的错误值。

3. 自定义代码生成模板

若上述两种方法都不适用,可修改Swagger CodeGen的Java POJO模板:

  • 找到插件默认的pojo.mustache模板文件(对应版本的模板可从Swagger CodeGen源码仓库获取)
  • 定位到生成@DecimalMax注解的代码段,修改数值格式化逻辑,确保输出完整的小数数值字符串
  • 在Maven插件配置中指定自定义模板路径:
<plugin>
  <groupId>io.swagger.codegen.v3</groupId>
  <artifactId>swagger-codegen-maven-plugin</artifactId>
  <version>3.0.35</version>
  <configuration>
    <templateDirectory>${project.basedir}/src/main/resources/swagger-templates</templateDirectory>
    <!-- 其他配置项 -->
  </configuration>
</plugin>

重新生成代码即可得到正确的注解值。

内容的提问来源于stack exchange,提问作者Dave

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:35:31