引用OpenAPI 2.0, Schema Object或Swagger 2.0, Schema Object,以及 discriminator
字段的定义为:
添加对多态性的支持 . 鉴别器是架构属性名称,用于区分继承此架构的其他架构 . 必须在此模式中定义使用的属性名称,它必须位于必需的属性列表中 . 使用时,值必须是此架构的名称或继承它的任何架构 .
My confusions/ questions:
-
这对我来说是模棱两可的,它在继承或多态中扮演的角色究竟是什么 . 有人可以用一个工作实例解释
discriminator
,显示它究竟做了什么以及如果我们不使用它会怎么样?某些操作依赖于它的任何错误,警告或任何工具? -
是否swagger-editor不支持
discriminator
,并且该字段用于其他一些工具?
What I have tried so far:
-
我试图使用swagger-editor和相同文档中的示例(也在下面提到),来玩这个属性,看看我是否可以看到它的任何特殊行为 . 我更改了属性,删除了它,并将
Dog
模型扩展到更深层次并在新的子模型上尝试相同,但我没有看到swagger-editor预览中的任何更改 . -
我尝试在线搜索,特别是stackoverflow问题,但没有找到任何相关信息 .
The sample code I used to do experiments:
definitions:
Pet:
type: object
discriminator: petType
properties:
name:
type: string
petType:
type: string
required:
- name
- petType
Cat:
description: A representation of a cat
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
huntingSkill:
type: string
description: The measured skill for hunting
default: lazy
enum:
- clueless
- lazy
- adventurous
- aggressive
required:
- huntingSkill
Dog:
description: A representation of a dog
allOf:
- $ref: '#/definitions/Pet'
- type: object
properties:
packSize:
type: integer
format: int32
description: the size of the pack the dog is from
default: 0
minimum: 0
required:
- packSize
2 回答
根据google group,
discriminator
在allOf
属性的顶部使用,并且它在超类型中定义为多态 . 如果未使用discriminator
,allOf
关键字将描述模型包含其他合成模型的属性 .就像在示例代码中一样,
Pet
是超类型,其属性petType
标识为discriminator
,Cat
是Pet
的子类型 . 以下是Cat
对象的json示例:discriminator
的使用旨在指示用于标识对象类型的属性 . 假设有些工具可以使用discriminator
正确支持定义对象,可以通过扫描属性来确定类型 . 例如,根据petType
标识对象是Cat
.但是,
discriminator
字段在当前版本的规范或样本中没有很好地定义(参见issue #403) . 据我所知,目前Swagger没有提供适当支持的工具 .如果模型具有用于确定类型的属性,则可以使用
discriminator
. 在这种情况下,它自然适合,它可以用作其他开发人员理解多态关系的指标 . 如果考虑使用支持discriminator
的ReDoc等第三方工具(请参阅gif和example中的petType
),您可能会觉得这很有用 .OpenApi 3中的鉴别器功能得到了很大改进 . 现在提供一个鉴别器对象,它包含鉴别器属性的名称,以及该属性值到模式名称的映射 .
(我意识到你确实问过OpenApi 2,但是在3中有很多改进,希望你可以使用它) .
请参阅:https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#discriminatorObject了解实际规格