swagger-ui - 指定非空对象时,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
}
解决方案
推荐阅读
- java - 使用 Volley 的 JsonObjectRequest 不起作用
- javascript - 在reactjs中过滤数组以限制键
- wpf - .NET Core 3.1 更新交互触发器和 Prism 后没有触发 SelectionChanged 事件
- api - 如何为我的烧瓶后端创建 oauth2 APi
- sql - 计算每行“v2”-“v1”之间的平均差异。如何衡量它与治疗时间?
- swift - SwiftUI - 想要在保持视图方向固定的同时为圆周设置动画
- wordpress - Wordpress - 在自定义父分类中获取帖子
- python - 熊猫:如何根据另一列计算一列中单词的频率
- python - 在循环中将 JSON 从 URL 添加到 DataFrame
- java - reactor.netty.http.client.PrematureCloseException:连接已在响应之前关闭,同时发送请求正文