У нас возникают проблемы с использованием дискриминатора 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
и свойство этого имени на самом деле одно и то же?