如何在Java中从JSON生成含多字段的Enum枚举类?
解决openapi-generator-maven-plugin生成多字段枚举的问题
openapi-generator默认仅支持生成单值枚举,要实现带id和name双字段的枚举结构,最直接可靠的方案是自定义Mustache模板——因为插件的代码生成逻辑完全基于模板文件。
步骤1:定制枚举模板
- 从openapi-generator的Java模板资源中提取默认的
enum.mustache文件(可在Maven依赖org.openapitools:openapi-generator:对应版本:java中找到,或直接从官方仓库复制基础模板)。 - 修改模板内容,适配双字段枚举的生成逻辑:
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
相关产品推荐
相关产品推荐

