OpenAPI 无法将 Enum 值转换为名称

问题描述 投票:0回答:1

使用OPENApi 3.0。我已经定义了一个可重用的 Emum 模式,如下所示

components:
schemas:
Color:
  type: integer
  enum: [1,2,3]
  x-enum-varnames: 
    - black
    - white
    - red

生成的 Enum 类只有 value 作为字段和 getValue()。 我面临的问题是我想发送枚举名称作为响应的一部分。有没有办法 openAPI 可以生成 getName().

java spring-boot openapi
1个回答
0
投票

为了解决您在使用 OpenAPI 3.0 和 Enum 类中自动生成方法时遇到的问题,让我们深入研究一些解决方案和解决方法:

1. 用于代码生成的自定义模板

大多数 OpenAPI 代码生成工具(例如 Swagger Codegen 或 OpenAPI Generator)允许您自定义用于生成源代码的模板。通过自定义这些模板,您可以向 Enum 类添加其他方法,例如

getName()
。这是一般方法:

  • 识别生成器工具:首先,确定您使用哪个工具来生成代码(例如 Swagger Codegen、OpenAPI Generator)。
  • 自定义模板:修改现有模板或创建包含用于枚举的
    getName()
    方法的自定义模板。这通常涉及编辑这些工具使用的 Mustache 模板文件。
  • 重新生成代码:在代码生成过程中使用您的自定义模板将新方法包含在您的枚举类中。

2. 后代定制

如果自定义模板不可行,另一种方法是在生成类后手动添加或自动添加

getName()
方法。这可以通过以下方式完成:

  • 手动添加:直接将方法添加到生成的类中。这很简单,但如果重新生成代码则需要重做。
  • 脚本:编写一个脚本,每当您重新生成代码时,该脚本都会自动将方法添加到生成的文件中。

3. 使用注释

对于 Java,某些工具(如

swagger-codegen
)支持注释,可以帮助更明确地管理枚举值。例如,使用
@JsonValue
注释(来自 Jackson 库)可以控制输出值。虽然这并不完全是您所要求的,但它对于控制序列化是相关且有用的:

public enum Color {
    black(1),
    white(2),
    red(3);

    private int value;

    Color(int value) {
        this.value = value;
    }

    @JsonValue
    public int getValue() {
        return value;
    }

    public String getName() {
        return name().toLowerCase();
    }
}

4. OpenAPI 生成器细节

如果您使用 OpenAPI Generator,您可能能够传递其他参数或使用更好支持枚举生成的特定库选项。检查特定于您正在使用的生成器的文档,因为有些生成器具有并非立即显而易见的高级枚举选项。

结论

解决方案很大程度上取决于您所使用的代码生成器的具体情况。每个生成器都有其细微差别和功能,特别是在它们如何处理枚举方面。自定义生成模板提供了最大的灵活性,但需要熟悉模板语言(如 Mustache)和生成器的自定义点。始终确保任何手动更改与您的整体项目管理策略保持一致,以避免后代覆盖自定义代码。

© www.soinside.com 2019 - 2024. All rights reserved.