从 springfox 迁移到 springdoc 时出现 Null ApiResponse
Null ApiResponse when migrating from springfox to springdoc
我正在尝试从 springfox-swagger2
(OpenAPI 2) 迁移到 springdoc-openapi-ui
(OpenAPI 3),以生成 swagger 文档。
这是一条示例路线:
@RequestMapping("/api/object/")
public interface IObjectController {
@RequestMapping(path = "v1/{param}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
ObjectDto getObjectByParamV1(@PathVariable("param") String code);
}
Swagger 生成在 springfox-swagger2
上工作得很好,但是我在 springdoc
上遇到以下问题:
Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
(through reference chain: io.swagger.v3.oas.models.OpenAPI["paths"]->
io.swagger.v3.oas.models.Paths["/api/object/v1/{param}"]->io.swagger.v3.oas.models.PathItem["get"]->
io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["null"])
确实,OpenAPI 尝试序列化以下对象:
responses: class ApiResponses {
{null=class ApiResponse {
description: default response
headers: null
content: class Content {
{*/*=class MediaType {
schema: class ComposedSchema {
class Schema {
type: null
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
allOf: null
anyOf: null
oneOf: [class Schema {
type: object
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}, class StringSchema {
class Schema {
type: string
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
}]
}
examples: null
example: null
encoding: null
}}
}
links: null
extensions: null
$ref: null
}, 200=class ApiResponse {
description: OK
headers: null
content: class Content {
{application/json=class MediaType {
schema: class Schema {
type: null
format: null
$ref: #/components/schemas/ObjectDto
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
examples: null
example: null
encoding: null
}}
}
links: null
extensions: null
$ref: null
}}
extensions: null
}
如您所见,ApiResponses
中有一个空的 ApiResponse
对象,奇怪的是它有一个 null
键,然后序列化在 jackon 的 MapSerializer.serialize()
中失败了:
// What is this _suppressNulls ?!
// _suppressableValue IS null, but is not suppressed
if ((_suppressableValue != null) || _suppressNulls) {
serializeOptionalFields(value, gen, provider, _suppressableValue);
}
无论我使用多少 Swagger 注释(@Operation
,添加 @ApiResponse
...),这个 null
ApiResponse 仍然存在。我不明白这是从哪里来的,特别是 suppressNull
只影响 values 而不是 keys,根据 MapSerializer.serializeOptionalFields()
.
如何删除这个 null
键控的 ApiResponse?
使用 v1.3.4 似乎对我来说工作正常。我使用的是 v1.3.3 并升级到最新的 v1.3.7 时出现问题。
我认为罪魁祸首是 https://github.com/springdoc/springdoc-openapi/issues/597
的修复
看起来原因是在异常处理程序上,@ExceptionHandler 上没有@ResponseStatus。
解决方法是添加以便在 swagger 文档中显示它。
存在已解决的问题:
修复将在 v1.3.8 上可用。
我正在尝试从 springfox-swagger2
(OpenAPI 2) 迁移到 springdoc-openapi-ui
(OpenAPI 3),以生成 swagger 文档。
这是一条示例路线:
@RequestMapping("/api/object/")
public interface IObjectController {
@RequestMapping(path = "v1/{param}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
ObjectDto getObjectByParamV1(@PathVariable("param") String code);
}
Swagger 生成在 springfox-swagger2
上工作得很好,但是我在 springdoc
上遇到以下问题:
Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)
(through reference chain: io.swagger.v3.oas.models.OpenAPI["paths"]->
io.swagger.v3.oas.models.Paths["/api/object/v1/{param}"]->io.swagger.v3.oas.models.PathItem["get"]->
io.swagger.v3.oas.models.Operation["responses"]->io.swagger.v3.oas.models.responses.ApiResponses["null"])
确实,OpenAPI 尝试序列化以下对象:
responses: class ApiResponses {
{null=class ApiResponse {
description: default response
headers: null
content: class Content {
{*/*=class MediaType {
schema: class ComposedSchema {
class Schema {
type: null
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
allOf: null
anyOf: null
oneOf: [class Schema {
type: object
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}, class StringSchema {
class Schema {
type: string
format: null
$ref: null
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
}]
}
examples: null
example: null
encoding: null
}}
}
links: null
extensions: null
$ref: null
}, 200=class ApiResponse {
description: OK
headers: null
content: class Content {
{application/json=class MediaType {
schema: class Schema {
type: null
format: null
$ref: #/components/schemas/ObjectDto
description: null
title: null
multipleOf: null
maximum: null
exclusiveMaximum: null
minimum: null
exclusiveMinimum: null
maxLength: null
minLength: null
pattern: null
maxItems: null
minItems: null
uniqueItems: null
maxProperties: null
minProperties: null
required: null
not: null
properties: null
additionalProperties: null
nullable: null
readOnly: null
writeOnly: null
example: null
externalDocs: null
deprecated: null
discriminator: null
xml: null
}
examples: null
example: null
encoding: null
}}
}
links: null
extensions: null
$ref: null
}}
extensions: null
}
如您所见,ApiResponses
中有一个空的 ApiResponse
对象,奇怪的是它有一个 null
键,然后序列化在 jackon 的 MapSerializer.serialize()
中失败了:
// What is this _suppressNulls ?!
// _suppressableValue IS null, but is not suppressed
if ((_suppressableValue != null) || _suppressNulls) {
serializeOptionalFields(value, gen, provider, _suppressableValue);
}
无论我使用多少 Swagger 注释(@Operation
,添加 @ApiResponse
...),这个 null
ApiResponse 仍然存在。我不明白这是从哪里来的,特别是 suppressNull
只影响 values 而不是 keys,根据 MapSerializer.serializeOptionalFields()
.
如何删除这个 null
键控的 ApiResponse?
使用 v1.3.4 似乎对我来说工作正常。我使用的是 v1.3.3 并升级到最新的 v1.3.7 时出现问题。
我认为罪魁祸首是 https://github.com/springdoc/springdoc-openapi/issues/597
的修复看起来原因是在异常处理程序上,@ExceptionHandler 上没有@ResponseStatus。
解决方法是添加以便在 swagger 文档中显示它。
存在已解决的问题:
修复将在 v1.3.8 上可用。