我在组件模式中使用 OpenAPI 3.0 继承,并且我有由 openapi-generator (使用 Jackson)生成的(Java)类。
为什么鉴别器属性在生成的 JSON 中被序列化两次?
这是一个 JHipster API-First 项目,它应该使用 openapi-generator 来生成 Java 模型(带有 Jackson 注释的 POJO)和 API 控制器(带有 Spring 的 @Api 注释的接口)。
通过遵循 OpenAPI 3.x 文档/示例,似乎使用 as 的属性discriminator
也必须在properties
模式列表中指定。
这样,生成的 Java 类似乎与 Jackson 使用注释的多态类型处理指南不同(此处),其中用作鉴别器的属性不得出现在类中。相反,生成的代码还包含此属性作为具有 getter/setter 的类属性。这会导致 JSON 输出包含该属性两次,如下所示。
我还尝试从 OpenAPIproperties
列表中删除该属性,保留完整的discriminator
部分;这样生成的代码符合杰克逊的指导方针,并且序列化工作得很好。另一方面,我在反序列化过程中遇到错误,因为在目标类中找不到(删除的)属性。
遵循 OpenAPI 3.x 文档指南:
TicketEvent:
type: object
description: A generic event
discriminator:
propertyName: type
required:
- id
- sequenceNumber
- timestamp
- type
properties:
id:
type: integer
format: int64
readOnly: true
sequenceNumber:
type: integer
readOnly: true
timestamp:
type: string
format: date-time
readOnly: true
type:
type: string
readOnly: true
TicketMovedEvent:
description: A ticket move event
allOf:
- $ref: '#/components/schemas/Event'
- type: object
required:
- source
- target
properties:
source:
$ref: '#/components/schemas/Queue'
target:
$ref: '#/components/schemas/Queue'
生成的类:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = TicketMovedEvent.class, name = "TicketMovedEvent")
})
public class TicketEvent {
...
@JsonProperty("type")
private String type;
JSON 包含该属性两次:
{
...
"type": "TicketMovedEvent",
"type": null,
...
}
properties
从列表中删除鉴别器属性:
TicketEvent:
type: object
description: A generic event
discriminator:
propertyName: type
required:
- id
- sequenceNumber
- timestamp
properties:
id:
type: integer
format: int64
readOnly: true
sequenceNumber:
type: integer
readOnly: true
timestamp:
type: string
format: date-time
readOnly: true
生成的没有type
属性的类:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes({
@JsonSubTypes.Type(value = TicketMovedEvent.class, name = "TicketMovedEvent")
})
public class TicketEvent {
...
// now the "type" property is missing
})
JSON 现在是正确的:
{
...
"type": "TicketMovedEvent",
...
}
我希望通过遵循 OpenAPI 3.x 指南,生成的类能够正确序列化/反序列化。
(边注)
在反序列化过程中,使用上述方法,您可能会收到以下错误:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "type" (class it.blutec.bludesk.web.api.model.TicketMovedEvent), not marked as ignorable ...
要解决此问题,您需要配置 Jackson ObjectMapper 对象以忽略这种情况。
ObjectMapper om = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)