使用 Swagger/OpenAPI 鉴别器,以便 Jackson 正确序列化对象

2024-04-01

我们在使用 OpenAPI 2.0 鉴别器时遇到了麻烦,无法让 Swagger 工具和 Jackson 序列化器都满意。

问题:在序列化过程中,Jackson 当前为鉴别器生成两个 JSON 属性,其中之一具有null value.

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"

AFAIU 鉴别器定义正确。The spec https://github.com/OAI/OpenAPI-Specification/blob/master/versions/2.0.md#fixed-fields-13要求它同时列出在propertiesrequired list.

使用的属性名称必须在此模式中定义,并且必须位于所需的属性列表中。使用时,该值必须是该模式或继承它的任何模式的名称。

Swagger 代码生成器

Swagger Java 代码生成器生成的内容如下:

@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带来一个很大的惊喜。由于仅在序列化和反序列化期间需要该字段,因此常规客户端代码不应访问它。人们甚至可能会争辩说,这个场根本不应该存在。

杰克逊序列化器

作为一个简单的测试台我用这个

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 代码生成器未生成private String errorType?或者杰克逊应该能够处理这个问题,即认识到它@JsonTypeInfo和那个名字的属性其实是同一个东西?


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Swagger/OpenAPI 鉴别器,以便 Jackson 正确序列化对象 的相关文章

随机推荐