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

时间:2018-05-03 21:09:34

标签: jackson swagger swagger-codegen openapi

我们在使用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"

AFAIU正确定义了鉴别器。 The spec要求将其列在propertiesrequired列表中。

  

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

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的访问者非常惊讶。由于该字段仅在序列化期间需要&反序列化常规客户端代码不应该访问它。人们甚至可以争辩说,这个领域根本就不存在。

杰克逊序列化

作为一个简单的试验台,我使用这个

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和该名称的属性实际上是同一个东西?

0 个答案:

没有答案