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

OpenAPI 3模式继承的正确allOf语法是什么?

邓高韵
2023-03-14

哪种语法是正确的-第一种,第二种,还是两者都正确?

components:
  schemas:
    FileContent:
      allOf:
        - $ref: '#/components/schemas/FileInfo'
        - type: object
          properties:
            storageMethod:
              $ref: '#/components/schemas/StorageMethod'
            contentRange:
              type: string
              nullable: true
            # ... other properties ...
          additionalProperties: false
components:
  schemas:
    FileContent:
      type: object
      allOf:
        - $ref: '#/components/schemas/FileInfo'
      properties:
        storageMethod:
          $ref: '#/components/schemas/StorageMethod'
        contentRange:
          type: string
          nullable: true
        # ... other properties ...
      additionalProperties: false

共有2个答案

郭建华
2023-03-14

我认为第二个:很长一段时间,json模式中忽略了与$ref相邻的模式关键字。后来他们在规范(AFAIK)中更改了它,但我不确定是否所有的工具

然而,我个人的偏好是将父模式和子模式属性放在<code>allOf<code>下,如

  schemas:
    FileContent:
      allOf:
        - $ref: '#/components/schemas/FileInfo'
        - type: object
          properties:
            storageMethod:
              $ref: '#/components/schemas/StorageMethod'
            contentRange:
              type: string
              nullable: true
            totalLength:
              type: integer
              format: int64
安奇
2023-03-14

就< code>allOf语法而言,两个版本都是正确的,并且在技术上是等效的:

allOf:
  - $ref: '#/components/schemas/Foo'
  - properties:
      # other properties
      # ...
allOf:
  - $ref: '#/components/schemas/Foo'
properties:
  # other properties
  # ...

在OpenAPI 3.1(默认情况下使用JSON模式2020-12)中,如果您只有一个$ref的话,甚至不需要allOf,因为$ref现在允许同级关键字。(但您仍然需要<code>allOf

# openapi: 3.1.0

$ref: '#/components/schemas/Foo'
properties:
  # other properties
  # ...

您的示例中的错误在其他地方——它是< code > additional properties:false 的存在。这个关键字是有问题的,因为它只知道它的直接兄弟< code>properties,而看不到allOf/oneOf/anyOf子模式或“继承”模式。对于您的示例,这意味着在< code>FileInfo模式中定义的属性实际上不允许出现在组合模式中。

这里有一些更多的例子来说明additionalProperties: false并不像人们期望的那样工作:

allOf:
  - $ref: '#/components/schemas/Foo'
  - $ref: '#/components/schemas/Bar'
additionalProperties: false

# Expected: Only the properties defined in Foo and Bar are allowed
# Actual: No properties are allowed
allOf:
  - $ref: '#/components/schemas/Foo'
  - properties:
      prop:
        type: string
    additionalProperties: false

# Expected: The allowed properties are `prop` and those defined in the Foo schema
# Actual: Only the `prop` property is allowed
allOf:
  - $ref: '#/components/schemas/Foo'
properties:
  prop:
    type: string
additionalProperties: false

# Expected: The allowed properties are `prop` and those defined in the Foo schema
# Actual: Only the `prop` property is allowed
Foo:
  type: html" target="_blank">object
  properties:
    foo:
      type: string
  additionalProperties: false

Bar:
  allOf:
    - $ref: '#/components/schemas/Foo'
    - properties:
        prop:
          type: string

# Expected: The Bar schema allows properties from Foo + the `prop` property
# Actual: The Bar schema allows only properties from Foo

这在OpenAPI 3.1/JSON模式2019-09中通过新的<code>unevaluedProperties:false<code>关键字解决。因此,以下内容将按您预期的方式工作:

# openapi: 3.1.0

$ref: '#/components/schemas/Foo'
properties:
  prop:
    type: string
unevaluatedProperties: false
 类似资料:
  • 问题内容: 我已经阅读了很多有关javascript中“继承”的文章。其中一些使用,而另一些则建议。我读得越多,我就越困惑,因为它似乎存在着无穷无尽的变体来解决继承问题。 有人可以告诉我最可接受的方式吗(如果有的话,是事实上的标准)吗? (我想要一个可以扩展或的基础对象。) 问题答案: 简单:并非在所有环境中均受支持,但可以填充。除此之外,两者具有不同的目的:只需创建一个对象从其他继承,同时 还

  • 问题内容: 假设我有多个继承方案: 有编写的两个典型方法的: (老式) (较新的样式) 但是,无论哪种情况,如果父类(和)没有遵循相同的约定,则代码将无法正常工作(某些代码可能会丢失,或被多次调用)。 那么又是什么正确的方法呢?说“保持一致,遵循一个或另一个”很容易,但是如果或来自第三方图书馆,那又如何呢?有没有一种方法可以确保所有父类构造函数都被调用(以正确的顺序,并且只能调用一次)? 编辑:看

  • 问题内容: 我正在尝试在内添加HTML代码段,但无法使用包含功能。看来的当前语法与以前的语法不同:我看到许多示例使用 但是在官方文档中,它说使用 但随后在页面下方显示为 无论如何,我尝试了 我的代码片段不是很多代码,但是有很多事情要做。这可能会引起问题,所以我只用单词代替了内容,仍然一无所获。 我还尝试过直接在页面中声明模板,如下所示: 并遍历了引用脚本的所有变体,仍然一无所获。 我的页面还有很多

  • 问题内容: 我是一名新的Python程序员,他正在从2.6.4跃升至3.1.1。在我尝试使用“ else if”语句之前,一切都很好。解释器在“ else if”中的“ if”之后给了我一个语法错误,原因是我似乎无法弄清。 我可能缺少一些非常简单的东西;但是,我无法自行找到答案。 问题答案: 在python中,“ else if”被拼写为“ elif”。 另外,您还需要在和之后加上一个冒号。 简单

  • 我正在编写一个条件,该条件检查thymleaf属性中的一个条件。 这是一个语法错误,请帮助我

  • 问题内容: 我已经使用具有继承性的Java绑定搜索了json模式,并且所有搜索都导致我使用“ allOf”。 使用allOf可能会解决我的问题,但我想知道json模式中是否有可以使用的构造,该构造将生成具有真实Java继承“ B扩展A”的Java代码- 而不是在B内插入A的所有属性? 我想知道这是否被支持/可行,或者我只是在做梦。如果不支持,我很想知道原因。 问题答案: 好吧,我是两者的作者: 当