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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 19:30:56