Spring 从 swaggerhub 生成的引导代码无法在其他属性上抛出 400
Spring boot code generated from swaggerhub is not able to throw 400 on additional properties
我已经登录到 swaggerhub 并生成了一个样本清单 API,这是他们模板的一部分。
在 codegen options
中选择 spring
作为服务器。勾选 useBeanValidation
复选框。生成代码,测试它。除了一件事之外,验证工作正常。我不想在 POST 有效负载上允许任何额外的 属性。
注意:openAPI 规范没有指定 'additionalProperties' 标志。根据我的理解,它默认为 'false' 。我也试图明确指定相同的内容。但没有运气。当我添加 additionalProperty 时没有抛出异常。
OpenAPI 规范
openapi: 3.0.0
servers:
# Added by API Auto Mocking Plugin
- description: SwaggerHub API Auto Mocking
url: https://virtserver.swaggerhub.com/xxxx/apionopenApi3/1.0.0
info:
description: This is a simple API
version: "1.0.0"
title: Simple Inventory API
contact:
email: you@your-company.com
license:
name: Apache 2.0
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
tags:
- name: admins
description: Secured Admin-only calls
- name: developers
description: Operations available to regular developers
paths:
/inventory:
get:
tags:
- developers
summary: searches inventory
operationId: searchInventory
description: |
By passing in the appropriate options, you can search for
available inventory in the system
parameters:
- in: query
name: searchString
description: pass an optional search string for looking up inventory
required: false
schema:
type: string
- in: query
name: skip
description: number of records to skip for pagination
schema:
type: integer
format: int32
minimum: 0
- in: query
name: limit
description: maximum number of records to return
schema:
type: integer
format: int32
minimum: 0
maximum: 50
responses:
'200':
description: search results matching criteria
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/InventoryItem'
'400':
description: bad input parameter
post:
tags:
- admins
summary: adds an inventory item
operationId: addInventory
description: Adds an item to the system
responses:
'201':
description: item created
'400':
description: 'invalid input, object invalid'
'409':
description: an existing item already exists
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/InventoryItem'
description: Inventory item to add
components:
schemas:
InventoryItem:
type: object
additionalProperties: False
required:
- id
- name
- manufacturer
- releaseDate
properties:
id:
type: string
format: uuid
example: d290f1ee-6c54-4b01-90e6-d701748f0851
name:
type: string
example: Widget Adapter
releaseDate:
type: string
format: date-time
example: '2016-08-29T09:12:33.001Z'
manufacturer:
$ref: '#/components/schemas/Manufacturer'
Manufacturer:
required:
- name
properties:
name:
type: string
example: ACME Corporation
homePage:
type: string
format: url
example: 'https://www.acme-corp.com'
phone:
type: string
example: 408-867-5309
type: object
additionalProperties: False
在 post API.
上获得了 400 个有效载荷
{
"id": "7f125802-7840-4ff0-8ddb-7c78c0948987",
"name11111": "Widget Adapter",
"releaseDate": "2016-08-29T09:12:33.001Z",
"manufacturer": {
"name": "ACME Corporation",
"homePage": "",
"phone": "408-867-5309"
}
}
预期 400 但未在 post
上获得此负载
{
"id": "7f125802-7840-4ff0-8ddb-7c78c0948983",
"name": "Widget Adapter",
"releaseDate": "2016-08-29T09:12:33.001Z",
"manufacturer": {
"name": "ACME Corporation",
"homePage": "",
"phone": "408-867-5309"
},
"newkey" : "newValue"
}
任何人都可以帮忙吗..我想完全禁止其他属性并在这些请求上抛出 400..
additionalProperties 的默认值实际上是 True,而不是 False。
添加 false 不会导致 swagger-codegen for Spring 实际上不允许其他字段,这已经够烦人了。在错误的方向 运行 几个小时后,我找到了解决方案:
在application.properties
spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=真
我遇到了同样的麻烦并尝试利用过滤器,但在将@RequestBody 的自动反序列化中使用的模型与 servlet 请求绑定以及在模型更改之间保持行为一致时遇到了问题。得出这个结论需要编写大量不必要的样板文件并浪费大量时间。
我还试图找到一种方法,在模型或任何模型注释的自动使用中注入一些行为,这将改变模型如何自动忽略其他字段而不报告错误的请求。穷尽注释之路后,我找到了解决方案。
我已经登录到 swaggerhub 并生成了一个样本清单 API,这是他们模板的一部分。
在 codegen options
中选择 spring
作为服务器。勾选 useBeanValidation
复选框。生成代码,测试它。除了一件事之外,验证工作正常。我不想在 POST 有效负载上允许任何额外的 属性。
注意:openAPI 规范没有指定 'additionalProperties' 标志。根据我的理解,它默认为 'false' 。我也试图明确指定相同的内容。但没有运气。当我添加 additionalProperty 时没有抛出异常。
OpenAPI 规范
openapi: 3.0.0
servers:
# Added by API Auto Mocking Plugin
- description: SwaggerHub API Auto Mocking
url: https://virtserver.swaggerhub.com/xxxx/apionopenApi3/1.0.0
info:
description: This is a simple API
version: "1.0.0"
title: Simple Inventory API
contact:
email: you@your-company.com
license:
name: Apache 2.0
url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
tags:
- name: admins
description: Secured Admin-only calls
- name: developers
description: Operations available to regular developers
paths:
/inventory:
get:
tags:
- developers
summary: searches inventory
operationId: searchInventory
description: |
By passing in the appropriate options, you can search for
available inventory in the system
parameters:
- in: query
name: searchString
description: pass an optional search string for looking up inventory
required: false
schema:
type: string
- in: query
name: skip
description: number of records to skip for pagination
schema:
type: integer
format: int32
minimum: 0
- in: query
name: limit
description: maximum number of records to return
schema:
type: integer
format: int32
minimum: 0
maximum: 50
responses:
'200':
description: search results matching criteria
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/InventoryItem'
'400':
description: bad input parameter
post:
tags:
- admins
summary: adds an inventory item
operationId: addInventory
description: Adds an item to the system
responses:
'201':
description: item created
'400':
description: 'invalid input, object invalid'
'409':
description: an existing item already exists
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/InventoryItem'
description: Inventory item to add
components:
schemas:
InventoryItem:
type: object
additionalProperties: False
required:
- id
- name
- manufacturer
- releaseDate
properties:
id:
type: string
format: uuid
example: d290f1ee-6c54-4b01-90e6-d701748f0851
name:
type: string
example: Widget Adapter
releaseDate:
type: string
format: date-time
example: '2016-08-29T09:12:33.001Z'
manufacturer:
$ref: '#/components/schemas/Manufacturer'
Manufacturer:
required:
- name
properties:
name:
type: string
example: ACME Corporation
homePage:
type: string
format: url
example: 'https://www.acme-corp.com'
phone:
type: string
example: 408-867-5309
type: object
additionalProperties: False
在 post API.
上获得了 400 个有效载荷{
"id": "7f125802-7840-4ff0-8ddb-7c78c0948987",
"name11111": "Widget Adapter",
"releaseDate": "2016-08-29T09:12:33.001Z",
"manufacturer": {
"name": "ACME Corporation",
"homePage": "",
"phone": "408-867-5309"
}
}
预期 400 但未在 post
上获得此负载{
"id": "7f125802-7840-4ff0-8ddb-7c78c0948983",
"name": "Widget Adapter",
"releaseDate": "2016-08-29T09:12:33.001Z",
"manufacturer": {
"name": "ACME Corporation",
"homePage": "",
"phone": "408-867-5309"
},
"newkey" : "newValue"
}
任何人都可以帮忙吗..我想完全禁止其他属性并在这些请求上抛出 400..
additionalProperties 的默认值实际上是 True,而不是 False。
添加 false 不会导致 swagger-codegen for Spring 实际上不允许其他字段,这已经够烦人了。在错误的方向 运行 几个小时后,我找到了解决方案:
在application.properties spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=真
我遇到了同样的麻烦并尝试利用过滤器,但在将@RequestBody 的自动反序列化中使用的模型与 servlet 请求绑定以及在模型更改之间保持行为一致时遇到了问题。得出这个结论需要编写大量不必要的样板文件并浪费大量时间。
我还试图找到一种方法,在模型或任何模型注释的自动使用中注入一些行为,这将改变模型如何自动忽略其他字段而不报告错误的请求。穷尽注释之路后,我找到了解决方案。