首页 > 解决方案 > 指定非空对象时,Swagger 字段验证失败

问题描述

当我的参数之一(指定为可为空的)设置为非空值时,Swagger ui 验证失败。

这是附加的 open-api.yaml 文件:

openapi: 3.0.0
info:
  version: "0.0.1"
  title: "Analytics API"
  description: "foobar Analytics API to provide customers with the ability to access their foobar data for analytics purpouses."

servers:
  - description: foobar analytics development server
    url: http://localhost:5000/
  - description: foobar analytics production server
    url: https://analytics.foobar.com/

paths:
  /users:
      get:
        tags:
          - Analytics Service
        description: |
          ## Description
          Retrieves all users based on the provided filter.
        parameters:
          - $ref: "#/components/parameters/user_filter"
        responses:
          "200":
            $ref: "#/components/responses/Users"
          "400":
            $ref: "#/components/responses/BadRequest"
          "401":
            $ref: "#/components/responses/Unauthorized"
          "403":
            $ref: "#/components/responses/Forbidden"
          "404":
            $ref: "#/components/responses/NotFound"
          "422":
            $ref: "#/components/responses/UnprocessableEntity"
          "429":
            $ref: "#/components/responses/TooManyRequests"
          default:
            $ref: "#/components/responses/InternalServerError"

parameters:
  user_filter:
    name: user_filter
    in: query
    required: true
    content:
      application/json:
        schema:
          title: UserFilter
          type: object
          additionalProperties: false
          properties:
            skip:
              type: number
              nullable: true
              default: 0
              minimum: 0
            limit:
              type: number
              nullable: true
              default: 15
              minimum: 0
            order:
              type: object
              additionalProperties: false
              nullable: true
              properties:
                id:
                  enum: ["asc", "desc"]
                  type: string
            where:
              type: object
              additionalProperties: false
              nullable: true
              properties:
                id:
                  type: object
                  additionalProperties: false
                  minProperties: 1
                  properties:
                    eq:
                      $ref: "#/components/schemas/id"
                    in:
                      $ref: "#/components/schemas/in"
                    ne:
                      $ref: "#/components/schemas/id"
            fields:
              type: object
              additionalProperties: true
              nullable: true
              properties:
                id:
                  type: boolean
                  default: true
                  nullable: true
                login_name:
                  type: boolean
                  default: true
                  nullable: true
                display_name:
                  type: boolean
                  default: true
                  nullable: true
                is_active:
                  type: boolean
                  default: true
                  nullable: true
                role:
                  type: boolean
                  default: true
                  nullable: true
                email:
                  type: boolean
                  default: true
                  nullable: true
                cell_phone:
                  type: boolean
                  default: true
                  nullable: true

            entities:
              type: object
              # additionalProperties: false
              nullable: true
              properties:
                travelClaims:
                  type: object
                  additionalProperties: false
                  nullable: true
                  properties:
                    include:
                      type: boolean
                      default: false
                    fields:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: boolean
                          default: true
                    order:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          enum: ["asc", "desc"]
                          type: string
                    where:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: object
                          additionalProperties: false
                          minProperties: 1
                          properties:
                            eq:
                              $ref: "#/components/schemas/id"
                userTimeSegments:
                  type: object
                  additionalProperties: false
                  nullable: true
                  properties:
                    include:
                      type: boolean
                      default: false
                    fields:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: boolean
                          default: true
                    order:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          enum: ["asc", "desc"]
                          type: string
                    where:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: object
                          additionalProperties: false
                          minProperties: 1
                          properties:
                            eq:
                              $ref: "#/components/schemas/id"
                tasks:
                  type: object
                  additionalProperties: false
                  nullable: true
                  properties:
                    include:
                      type: boolean
                      default: false
                    fields:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: boolean
                          default: true
                    order:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          enum: ["asc", "desc"]
                          type: string
                    where:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: object
                          additionalProperties: false
                          minProperties: 1
                          properties:
                            eq:
                              $ref: "#/components/schemas/id"
                userTargets:
                  type: object
                  additionalProperties: false
                  nullable: true
                  properties:
                    include:
                      type: boolean
                      default: false
                    fields:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: boolean
                          default: true
                    order:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          enum: ["asc", "desc"]
                          type: string
                    where:
                      type: object
                      additionalProperties: false
                      nullable: true
                      properties:
                        id:
                          type: object
                          additionalProperties: false
                          minProperties: 1
                          properties:
                            eq:
                              $ref: "#/components/schemas/id"

下面附上了解析为 URL 查询的失败过滤器。当“字段”键被分配一个非空对象时它会失败 - 但是当“字段”被分配为空时验证通过。

{
  "fields": {
    "id": true,
    "login_name": true,
    "display_name": true,
    "is_active": true,
    "role": true,
    "email": true,
    "cell_phone": true
  },
  "where": {
    "is_active": {
      "op": "EQ",
      "value": "string"
    },
    "role": {
      "op": "EQ",
      "value": "string"
    }
  },
  "order": {
    "display_name": ""
  },
  "entities": {
    "travelClaims": {
      "fields": {
        "id": true,
        "user_id": true,
        "display_name": false,
        "user_is_active": false,
        "date": true,
        "claimed_distance": true,
        "recorded_distance": true,
        "comment": false,
        "odometer_start": false,
        "ododmeter_end": false
      },
      "order": {
        "display_name": "",
        "date": ""
      },
      "where": {
        "user_id": {
          "op": "EQ",
          "value": "string"
        },
        "user_is_active": {
          "op": "EQ",
          "value": "string"
        }
      },
      "include": false
    },
    "userTimeSegments": {
      "fields": {
        "user_id": true,
        "display_name": false,
        "user_is_active": false,
        "activity": true,
        "start_time": true,
        "end_time": true,
        "recorded_distance": false
      },
      "order": {
        "display_name": "",
        "activity": "",
        "start_time": ""
      },
      "where": {
        "user_id": {
          "op": "EQ",
          "value": "string"
        },
        "user_is_active": {
          "op": "EQ",
          "value": "string"
        },
        "activity": {
          "op": "EQ",
          "value": "string"
        }
      },
      "include": false
    },
    "tasks": {
      "fields": {
        "id": true,
        "task_type": true,
        "added_date": false,
        "due_date": true,
        "user_id": true,
        "display_name": false,
        "user_is_active": false,
        "customer_id": false,
        "customer_code": false,
        "customer_name": false,
        "customer_is_active": false,
        "activity_id": true,
        "comment": false,
        "completed_date": true,
        "is_anytime": true,
        "end_time": true
      },
      "order": {
        "task_type": "",
        "display_name": "",
        "customer_name": "",
        "due_date": "",
        "completed_date": ""
      },
      "where": {
        "task_type": {
          "op": "EQ",
          "value": "string"
        },
        "user_id": {
          "op": "EQ",
          "value": "string"
        },
        "user_is_active": {
          "op": "EQ",
          "value": "string"
        },
        "customer_id": {
          "op": "EQ",
          "value": "string"
        },
        "customer_is_active": {
          "op": "EQ",
          "value": "string"
        }
      },
      "include": false
    },
    "userTargets": {
      "fields": {
        "id": true,
        "user_id": true,
        "display_name": true,
        "user_is_active": false,
        "start_date": true,
        "end_date": true,
        "target": true
      },
      "order": {
        "display_name": "",
        "start_date": ""
      },
      "where": {
        "user_id": {
          "op": "EQ",
          "value": "string"
        },
        "user_is_active": {
          "op": "EQ",
          "value": "string"
        }
      },
      "include": false
    }
  },
  "skip": 0,
  "limit": 0
}

标签: swagger-uiswagger-2.0

解决方案


推荐阅读