Мы следуем первому подходу к созданию API.
В одном из сценариев, где мы хотим использовать наследование, я не могу определить для него спецификацию.
Это тип С# для него
public class PublishRequest
{
[JsonProperty("notificationType")]
public string NotificationType { get; set; }
[JsonProperty("source")]
public string Source { get; set; }
[JsonProperty("timestamp")]
public string Timestamp { get; set; }
[JsonProperty("payload")]
public List<BaseObject> Payload { get; set; }
}
Этот класс имеет свойство для BaseObject
public class BaseObject
{
[JsonProperty("Id")]
public string Id { get; set; }
}
Весь дальнейший тип наследуется от этого типа, который выглядит так:
public class Accounts:BaseObject
{
[JsonProperty("phone")]
public string Phone { get; set; }
[JsonProperty("accountid")]
public string AccountID { get; set; }
[JsonProperty("name")]
public string Name { get; set; }
[JsonProperty("legalname")]
public string LegalName { get; set; }
[JsonProperty("website")]
public string Website { get; set; }
[JsonProperty("linkedin")]
public string LinkedIn { get; set; }
[JsonProperty("twitter")]
public string Twitter { get; set; }
}
Спецификация, в которой используются эти классы, такова:
/notification/publish:
post:
summary: publish notification
tags:
- Notification
requestBody:
description: publish request body
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PublishRequest'
responses:
"200":
description: success message
проблема, с которой я сталкиваюсь, заключается в определении схемы для нее.
Схема выглядит так
PublishRequest:
required:
- notificationType
properties:
notificationType:
type: string
enum: [account_created, account_updated]
source:
type: string
enum: [A, B]
timestamp:
type: string
format: date-time
payload:
$ref: "#/components/schemas/NotificationPayload"
NotificationPayload:
type: array
items:
oneOf:
- $ref: "#/components/schemas/Account"
BaseObject:
properties:
Id:
type: string
Account:
allOf:
$ref: '#/components/schemas/BaseObject'
type: object
properties:
phone:
type: string
accountId:
type: string
name:
type: string
legalname:
type: string
website:
type: string
linkedin:
type: string
twitter:
type: string
facebook:
type: string
defaultcurrency:
type: string
Я продолжаю получать эту ошибку в редакторе swagger
Structural error at components.schemas.Account.allOf
should be array
@Helen Вручную





Правильный синтаксис для allOf выглядит следующим образом. allOf принимает список подсхем, поэтому каждая подсхема должна иметь префикс - в YAML.
Account:
allOf:
- $ref: '#/components/schemas/BaseObject'
- type: object
properties:
phone:
type: string
...
Еще пара вещей:
В NotificationPayloaditems не нужно oneOf, потому что есть только одна подсхема.
NotificationPayload:
type: array
items:
$ref: "#/components/schemas/Account"
Не забудьте добавить type: object к схемам объектов, в данном примере — PublishRequest и BaseObject. Одного ключевого слова properties недостаточно, чтобы указать тип объекта, а схемы без type на самом деле означает «любой тип».
Вы пишете спецификацию вручную или генерируете ее из кода с помощью Swashbuckle/Swagger-Net?