我正在使用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员工规范扩展它
您提供的示例中的鉴别器不正确。鉴别器不直接取值。它是一个具有属性的对象。您需要为鉴别器指定属性名称
才能注册。
试试这个:
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-抽象
添加到你的小胡子模板中,你希望它在哪里工作。网上有很多例子来展示如何将扩展添加到模板中。这是一个很好的例子,说明如何使用扩展来增强一个非常聪明的人的模板。