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)
在这种情况下,唯一的约束条件Cat,Dog并且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块的影响。
MyResponseType和APet班?MyResponseType班级应该是什么样的?MyResponseType从文件中删除,Pet而是使用 ? 如果是这样,那么 swagger 编辑器就不能再追踪子类型了……oneOf加到Pet架构中,以便 swagger 编辑器可以显示子类型?我已经尝试过,它有效,并且验证器说它符合 Open API 3,但警告说有一个循环妨碍了。在我看来,这将是正式错误:用一个HTTP主体Cat(petType猫)与所有Cat和Dog性质将验证因为的oneOf猫/狗/蜥蜴从继承Pet。我这样解释是否正确?