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

如何在Java中从JSON生成含多字段的Enum枚举类?

解决openapi-generator-maven-plugin生成多字段枚举的问题

openapi-generator默认仅支持生成单值枚举,要实现带id和name双字段的枚举结构,最直接可靠的方案是自定义Mustache模板——因为插件的代码生成逻辑完全基于模板文件。

步骤1:定制枚举模板

  1. 从openapi-generator的Java模板资源中提取默认的enum.mustache文件(可在Maven依赖org.openapitools:openapi-generator:对应版本:java中找到,或直接从官方仓库复制基础模板)。
  2. 修改模板内容,适配双字段枚举的生成逻辑:
public enum {{classname}} {
{{#allowableValues}}
{{#enumVars}}
  {{enumName}}({{value}}, "{{description}}"){{^last}},{{/last}}
{{/enumVars}}
{{/allowableValues}};

  private final Integer id;
  private final String name;

  private {{classname}}(Integer id, String name) {
    this.id = id;
    this.name = name;
  }

  // 可选:添加字段getter方法
  public Integer getId() {
    return id;
  }

  public String getName() {
    return name;
  }
}

模板中的{{enumName}}、{{value}}、{{description}}会和后续OpenAPI规范中的扩展字段一一对应。

步骤2:在OpenAPI规范中定义枚举元数据

在你的OpenAPI YAML/JSON文件里,给目标枚举类型添加扩展字段,关联枚举常量名、id值和名称:

components:
  schemas:
    OrderType:
      type: integer
      enum: [1, 2, 3, 4]
      x-enum-varnames: ["UNKNOWN", "TYPEA", "TYPEB", "TYPEC"]
      x-enum-descriptions: ["Undefined", "Type A", "Type B", "Type C"]
  • enum数组对应枚举的id值
  • x-enum-varnames对应枚举常量的大写名称(如UNKNOWN)
  • x-enum-descriptions对应枚举的显示名称(如Undefined)

步骤3:配置Maven插件使用自定义模板

在openapi-generator-maven-plugin的配置中,指定自定义模板的存放目录:

<plugin>
  <groupId>org.openapitools</groupId>
  <artifactId>openapi-generator-maven-plugin</artifactId>
  <version>6.6.0</version> <!-- 使用最新稳定版本 -->
  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
      <configuration>
        <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec>
        <generatorName>java</generatorName>
        <templateDirectory>${project.basedir}/src/main/resources/templates</templateDirectory> <!-- 存放自定义enum.mustache的目录 -->
        <modelPackage>com.yourpackage.dto</modelPackage> <!-- 枚举生成的目标包路径 -->
        <!-- 其他必要配置(如生成语言、输出目录等) -->
      </configuration>
    </execution>
  </executions>
</plugin>

额外提示

你提供的示例枚举中存在小错误:构造方法的类名WorkOrderType应该和枚举类名OrderType一致,使用自定义模板会自动通过{{classname}}填充正确的类名,避免这类手动失误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:20:27