Mar*_*tör 5 jackson swagger openapi swagger-codegen
我们在使用 OpenAPI 2.0 鉴别器时遇到了麻烦,让 Swagger 工具和 Jackson 序列化器都满意。
问题:在序列化期间,Jackson 当前为鉴别器生成两个 JSON 属性,其中之一具有null值。
OpenAPI 2.0 定义
swagger: '2.0'
info:
version: v1
title: Error API
paths:
/errors:
get:
description: Stack Overflow test
responses:
'200':
description: OK
schema:
$ref: '#/definitions/SpecificError'
definitions:
GeneralError:
description: Error Base Structure
type: object
discriminator: errorType
properties:
errorType:
type: string
message:
type: string
required:
- errorType
SpecificError:
description: Test
allOf:
- $ref: "#/definitions/GeneralError"
Run Code Online (Sandbox Code Playgroud)
AFAIU 鉴别器被正确定义。规范要求它同时列在properties和required列表中。
使用的属性名称必须在此模式中定义,并且必须在所需的属性列表中。使用时,该值必须是该模式或继承它的任何模式的名称。
Swagger 代码生成器
Swagger Java 代码生成器生成的是:
swagger: '2.0'
info:
version: v1
title: Error API
paths:
/errors:
get:
description: Stack Overflow test
responses:
'200':
description: OK
schema:
$ref: '#/definitions/SpecificError'
definitions:
GeneralError:
description: Error Base Structure
type: object
discriminator: errorType
properties:
errorType:
type: string
message:
type: string
required:
- errorType
SpecificError:
description: Test
allOf:
- $ref: "#/definitions/GeneralError"
Run Code Online (Sandbox Code Playgroud)
的存取器errorType是一个很大的惊喜。由于该字段仅在序列化和反序列化期间才需要,因此常规客户端代码不应访问它。人们甚至可以争辩说该领域根本不应该存在。
杰克逊串行器
作为一个简单的测试床,我使用这个
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "errorType",
visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = SpecificError.class, name = "SpecificError"),
})
public class GeneralError {
@JsonProperty("errorType")
private String errorType = null;
// accessors, even for errorType!, follow here
Run Code Online (Sandbox Code Playgroud)
这产生{"errorType":"SpecificError","message":"message","errorType":null}.
->errorType出现两次
问:是谁的错?我的 Swagger 定义错了吗?Swagger Java 代码生成器不应该生成private String errorType吗?或者杰克逊是否应该能够处理这个问题,即承认它@JsonTypeInfo和那个名字的属性实际上是一回事?
| 归档时间: |
|
| 查看次数: |
2263 次 |
| 最近记录: |