我们在使用OpenAPI 2.0鉴别器方面遇到了麻烦,因为Swagger工具和Jackson序列化器都很开心 .
问题:在序列化期间,Jackson当前为鉴别器生成两个JSON属性,其中一个具有 null
值 .
OpenAPI 2.0 definition
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"
AFAIU正确定义了鉴别器 . The spec要求它在 properties
和 required
列表中列出 .
必须在此模式中定义使用的属性名称,它必须位于必需的属性列表中 . 使用时,值必须是此架构的名称或继承它的任何架构 .
Swagger codegen
Swagger Java codegen产生的是:
@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
errorType
的访问者非常惊讶 . 由于该字段仅在序列化和反序列化期间需要,因此常规客户端代码根本不应该存在 .
Jackson serializer
作为一个简单的试验台,我使用它
SpecificError specificError = (SpecificError) new SpecificError().message("message")
ObjectMapper objectMapper = new ObjectMapper();
ObjectWriter writer = objectMapper.writer();
writer.writeValue(System.out, specificError);
这会产生 {"errorType":"SpecificError","message":"message","errorType":null}
.
-
errorType
出现两次
问:谁的错?我的Swagger定义错了吗? Swagger Java codegen是否应该生成 private String errorType
?或者Jackson应该能够处理这个问题,即认识到它的 @JsonTypeInfo
和该名称的属性实际上是同一个东西?