Используйте дискриминатор Swagger / OpenAPI, чтобы Джексон правильно сериализовал объект - PullRequest
0 голосов
/ 04 мая 2018

У нас возникают проблемы с использованием дискриминатора OpenAPI 2.0, который радует как инструменты Swagger, так и сериализатор Джексона.

Проблема: во время сериализации Джексон в настоящее время генерирует два свойства 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, дискриминатор определен правильно. Спецификация требует, чтобы она была указана как в properties, так и в required списке.

Используемое имя свойства ДОЛЖНО быть определено в этой схеме, и оно ДОЛЖНО быть в списке обязательных свойств. При использовании значение ДОЛЖНО быть именем этой схемы или любой схемы, которая ее наследует.

Swagger codegen

Что генерирует Java-код Swagger:

@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 появляется дважды

Q: чья это вина? Мое определение Swagger неверно? Должен ли Java-код Swagger не генерировать private String errorType? Или Джексон сможет справиться с этим, т. Е. Признать, что его @JsonTypeInfo и свойство этого имени на самом деле одно и то же?

...