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
相关产品推荐
相关产品推荐

