当前位置: 首页 > 知识库问答 >
问题:

OpenAPI 3.0在不同模式中重用枚举值

傅峰
2023-03-14

我有多个请求体需要使用相同的枚举,但我很难跨多个模式引用单个定义。

在我的< code>openapi.yaml文件中,我包含了:

components:
  schemas:
    Widget:
      type: string
      enum:
        - THING

在我为 POST/PUT 请求设置的正文定义中,我包括:

  widget:
    schema:
      $ref: '#/../openapi.yaml/components/schemas/Widget'
    description: Include Widgets in your API today!

但在生成的代码中,正在创建的是:

  @JsonProperty("widget")
  private Object widget; // expecting: `private Widget widget;`

而一个单独的类是使用以下命令创建的:

@Generated(value = "org.openapitools.codegen.languages.SpringCodegen")
public enum Widget {
  
  WIDGET("WIDGET"),
  
  private String value;

  Association(String value) {
    this.value = value;
  }

  @JsonValue
  public String getValue() {
    return value;
  }
...

如何跨文件创建对枚举定义的引用?

共有1个答案

解飞语
2023-03-14

正确的语法是

  widget:
    $ref: '../openapi.yaml#/components/schemas/Widget'

也就是说,在属性定义中不需要架构关键字。此外,# 在文件名之后,而不是在文件名之前。

文件名(<代码>../openapi.yaml)仅在模式位于单独的文件中时才需要。如果< code>Widget模式与POST/PUT请求定义在同一个文件中,则不需要文件名:

  widget:
    $ref: '#/components/schemas/Widget'

如果您想在<code>$ref,则需要将<code>$ref</code>包装为<code>allOf</code>(如下所述):

  widget:
    allOf:
      - $ref: '#/components/schemas/Widget'
    description: Include Widgets in your API today!
 类似资料:
  • 让我们看看一个需要诉诸于代码的场景,来考虑为何此时使用枚举更为合适且实用。假设我们要处理 IP 地址。目前被广泛使用的两个主要 IP 标准:IPv4(version four)和 IPv6(version six)。这是我们的程序可能会遇到的所有可能的 IP 地址类型:所以可以 枚举 出所有可能的值,这也正是此枚举名字的由来。 任何一个 IP 地址要么是 IPv4 的要么是 IPv6 的,而且不能

  • 为什么要在C++11中编译: 但这不是:

  • 我真的很想在代码中做到这一点,但这个错误是:重新定义枚举器“TEST” 有没有办法绕过这个问题,因为我真的希望在不同的枚举中使用相同的名称。还有为什么会发生这种情况?

  • 问题内容: 我不了解如何实现模式的版本。下面是使用Singleton模式实现“传统”方法的示例。我想将其更改为使用Enum版本,但不确定如何。 问题答案: 这是您的单例:一个只有一个实例的枚举。 请注意,此单例是线程安全的,而您的不是:线程安全的:两个线程可能都陷入竞争状况或可见性问题,并且都创建了自己的单例实例。

  • 首先,这就是为什么这个问题不是重复的: 我知道在SO上已经问了很多关于将一个转换为另一个的问题,我甚至自己回答了其中一个问题,但是我在这个主题上发现的所有问题都有一些比较不同枚举值的方法(无论是通过名称还是按价值)。在我的特殊情况下,我不知道值,名字也不匹配。 作为我正在做的一个名为ADONETHelper的GitHub项目的一部分,该项目旨在最大限度地减少与Ado一起工作时的代码重复。Net中,

  • 我有几个具有相同的字段名: 尝试使用枚举类: 得到错误: