如何阻止OpenAPI从YAML生成带值枚举?适配Spring Boot数据库存储
解决OpenAPI生成纯无值枚举的方案
要让OpenAPI Generator生成仅含枚举项的Java枚举(而非带构造方法和值的版本),需通过代码生成器的配置参数实现,而非修改YAML定义。
1. 配置代码生成器
Maven插件配置
在pom.xml的OpenAPI Generator插件中添加usePlainEnum=true:
<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>你的版本号</version> <executions> <execution> <goals> <goal>generate</goal> </goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec> <generatorName>java</generatorName> <configOptions> <!-- 核心配置:生成纯枚举项,无值字段和构造方法 --> <usePlainEnum>true</usePlainEnum> </configOptions> </configuration> </execution> </executions> </plugin>
Gradle插件配置
openapiGenerate { generatorName = "java" inputSpec = file("src/main/resources/openapi.yaml").path configOptions = [ usePlainEnum: "true" ] }
命令行生成
openapi-generator-cli generate -i openapi.yaml -g java --use-plain-enum
2. 关于enumAsRef: true的说明
enumAsRef: true的作用是将YAML中的枚举定义转为独立的引用类(避免内联在其他DTO中),和枚举是否带值无关,所以不是你需要的参数。
3. Spring Boot数据库序号存储调整
生成纯枚举后,JPA默认按枚举的ordinal()(从0开始)存储。若需存储从1开始的序号,可通过自定义转换器实现:
import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; @Converter(autoApply = true) public class DocumentCodeConverter implements AttributeConverter<DocumentCode, Integer> { @Override public Integer convertToDatabaseColumn(DocumentCode attribute) { return attribute != null ? attribute.ordinal() + 1 : null; } @Override public DocumentCode convertToEntityAttribute(Integer dbData) { return dbData != null ? DocumentCode.values()[dbData - 1] : null; } }
将该转换器注册后,数据库中会存储从1开始的序号,查询时自动转回枚举字符串。
内容的提问来源于stack exchange,提问作者827 men
相关产品推荐
相关产品推荐

