提问者:小点点

使用openapi 3.0从空抽象类继承


我正在使用open api 3.0.3我浏览了留档和另一个类似的问题Swagger继承和组合。

但是我没有成功地让它工作。

在Java代码中,这是我想要的:

public abstract BaseClass{}

public Employee extends BaseClass {...}

请注意,BaseClass是空的。我尝试了各种方法,如使用鉴别器等,但不清楚如何使其工作。例子:

  BaseClass:
  discriminator: classType
    required:
      - classType
    properties:
      entityType:
        type: string
        enum:
          - Employee

  Employee:
    allOf:
    - $ref: "BaseEntity"
    properties:
    #...properties defined here...

我知道open api不支持抽象,但也许还有其他一些机制,例如扩展。

想看看是否有人知道如何使用open-api做到这一点?

PS:也试过这样的东西,没有工作

BaseClass:
  type: object
  abstract: true
  properties:
    dummy:
      type: string
      description: "Dummy property to allow an empty base class"
      readOnly: true

我尝试了x-抽象:同样如此,不起作用。我对其他建议持开放态度,例如手动定义BaseClass并以某种方式让openAPI员工规范扩展它


共1个答案

匿名用户

您提供的示例中的鉴别器不正确。鉴别器不直接取值。它是一个具有属性的对象。您需要为鉴别器指定属性名称才能注册。

试试这个:

components:
  schemas:
    BaseClass:
      type: object
      required:
        - entityType
      properties:
        entityType:
          type: string
          enum:
            - Employee
      discriminator:
        propertyName: entityType

    Employee:
      allOf:
        - $ref: "#/components/schemas/BaseClass"
      properties:
        anotherThing:
          type: string

这是让您上面的模式工作的最小更改。但是,它不会创建一个空的BaseClass。这是因为BaseClass必须在其中具有鉴别器。这是这种类型的继承所期望的。它也不会是抽象的。但是,您请求的其他所有内容都可以工作。

似乎你真的希望它是抽象和空的。你提到你试图用x-抽象来做到这一点。这不是一件事。你可以让它成为一件事,但是支持的供应商扩展列表没有提到它。你不能指望它理解你编造的供应商扩展,而不告诉它它意味着什么。这是通过小胡子模板完成的。你必须将扩展x-抽象添加到你的小胡子模板中,你希望它在哪里工作。网上有很多例子来展示如何将扩展添加到模板中。这是一个很好的例子,说明如何使用扩展来增强一个非常聪明的人的模板。