Swagger 中的多态性在鉴别器上产生奇怪的错误消息

Mig*_*noz 1 swagger-2.0

我正在编写一个带有 GET 的服务,它可以返回五种不同但密切相关的类型之一。由于用户想要同时搜索所有五种类型的选项,因此它必须是单个 get 调用。我返回 JSON,它可以轻松处理任何类型。

我正在尝试在 Swagger 中使用它们的多态性功能来做到这一点,这是我以前从未尝试过的。我所做的就像在示例中一样,除了在“定义”而不是“组件/模式”下。但我收到一条我无法理解的奇怪错误消息。swagger 文件如下。错误是这样说的:

定义 ['Event'] 处的架构错误。discriminator 应该是字符串

它在第 49 行给出了这个,上面写着discriminator:

所以,我的两个问题是:我该如何解决它?这还能满足我的需要吗?

swagger: '2.0'
info:
  description: RESTful API to retrieve Titles Metadata
  version: 1.0.0
  title: Swagger Mystery

schemes:
- https
paths:
  /event:
    get:
      operationId: getEvent
      summary: searches names
      description: |
        Search by names, across all types, or by a specific type.
      produces:
      - application/json
      parameters:
      - in: query
        name: title
        description: name to search for
        required: true
        type: string
      - in: query
        name: start
        required: false
        type: boolean
      - in: query
        name: type
        required: false
        type: string
        description: |
          May be "contest", "partner", "sponsor", or "dancer". If missing, will search for all types.
      responses:
        '200':
          description: search results
# I also don't know why I need to comment these out.
          # content:
          #   application/json:
          #     schema:
          #       type: array
          #       items:
          #         $ref: '#/definitions/Event'
        '400':
          description: bad input parameter
definitions:
  Event:
    type: object
    discriminator:
      propertyName: eventType
    properties:
      eventType:
        type: string
      id:
        type: integer
        format: int64
      name:
        type: string
      description:
        type: string
      contests:
        type: array
        items: 
          $ref: '#/definitions/Contest'
    required:
    - id
    - name
    - description
    - contests
    - eventType
  Contest:
    allOf:
    - $ref: '#/definitions/Event'
    - type: object
      properties:
        parentEvent:
          type: string
        venue:
          type: string
      required:
      - parentEvent
      - venue
  Dancer:
    allOf:
    - $ref: '#/definitions/Event'
    - type: object
      properties:
        eventInvitationDate:
          type: string
          format: date
        venue:
          type: string
      required:
      - eventInvitationDate
      - venue
  # Sponsor:
  #   allOf:
  #   - $ref: '#/definitions/Event'
  #   - type: object
  #     properties:
  #       invitationDate:
  #         type: string
  #         format: date
  #       parentEvent:
  #         type: string
  #       partners:
  #         type: array
  #         items:
  #           $ref: '#/definitions/Partner'
  Partner:
    allOf:
    - $ref: '#/definitions/Event'
    - type: object
      properties:
        invitationDate:
          type: string
          format: date
        parentEvent:
          type: string
        venue:
          type: string
      required:
      - invitationDate
      - parentEvent
      - venue
# two problems:
# 1. Schema error at definitions['Event'].discriminator
#    should be string on line 49 (discriminator:)
# 2. Resolver error:
#    e is undefined
#    (no line number)
#    (This error goes away when I comment out Sponsor.)
Run Code Online (Sandbox Code Playgroud)

Hel*_*len 5

出现此错误是因为您混合了 OpenAPI 2.0 和 3.0 语法。

\n\n

您的规范是swagger: \'2.0\'但以下是 3.0 语法:

\n\n
discriminator:\n  propertyName: eventType\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 OpenAPI 2.0 中, 的值为discriminator属性名称:

\n\n
discriminator: eventType\n
Run Code Online (Sandbox Code Playgroud)\n\n

此外,OpenAPI 2.0 假设鉴别器属性的可能值(在本例中为eventType)与 中的模型名称完全相同definitions。那是:

\n\n
    \n
  • 如果eventType可以是event小写partner的 等,那么模型名称也必须是小写的 \xe2\x80\x93 event,而不是Event
  • \n
  • 如果是诸如、等eventType代码,则型号名称必须是、等,而不是等。epdepdEventPartner
  • \n
\n\n

查看问题以获取discriminatorOpenAPI 2.0 中的更多用法示例:

\n\n\n