在 Open API 3 中正确使用多态/继承

Pie*_*mot 7 polymorphism inheritance swagger openapi

我在 Open API 3 中正确使用多态性时遗漏了一些东西。

规范文档 (3.0.2) 中,一个示例使用oneOf,并且可选地使用Discriminator块:

    MyResponseType:  
     oneOf:
      - $ref: '#/components/schemas/Cat'
      - $ref: '#/components/schemas/Dog'
      - $ref: '#/components/schemas/Lizard'  
     discriminator:
        propertyName: petType
Run Code Online (Sandbox Code Playgroud)

在这种情况下,唯一的约束条件CatDog并且Lizard必须满足是强制性字段petType,和一个预定值。稍后,可以阅读:

为了避免冗余,可以将鉴别器添加到父模式定义中,并且在 allOf 构造中包含父模式的所有模式都可以用作替代模式。

我觉得它很好,因为它提供了对 3 个实体的自然继承的正确使用:

components:
  schemas:
    Pet:
      type: object
      required:
      - petType
      properties:
        petType:
          type: string
      discriminator:
        propertyName: petType
        mapping:
          dog: Dog
    Cat:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Cat`
        properties:
          name:
            type: string
etc
Run Code Online (Sandbox Code Playgroud)

顺便说一下,规范有点模棱两可

鉴别器对象仅在使用复合关键字 oneOf、anyOf、allOf 之一时才合法

Pet 不包含任何这些关键字!

但是,第二个示例并未显示对MyResponseType块的影响。

  1. 它保持不变吗?如果是这样,应该在 Java 中生成什么?AMyResponseType和APet班?MyResponseType班级应该是什么样的?
  2. 应该MyResponseType从文件中删除,Pet而是使用 ? 如果是这样,那么 swagger 编辑器就不能再追踪子类型了……
  3. 那么,我们是否应该将oneOf加到Pet架构中,以便 swagger 编辑器可以显示子类型?我已经尝试过,它有效,并且验证器说它符合 Open API 3,警告说有一个循环妨碍了。在我看来,这将是正式错误:用一个HTTP主体Cat(petType猫)与所有CatDog性质将验证因为的oneOf猫/狗/蜥蜴从继承Pet。我这样解释是否正确?