Подтипы не генерируются в схеме, если базовый класс не аннотирован @JsonSubTypes.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Подтипы не генерируются в схеме, если базовый класс не аннотирован @JsonSubTypes.

Сообщение Anonymous »

Схемы подтипов не генерируются, если моя модель Джексона (базовый/родительский класс) не использует аннотацию @JsonSubTypes или @Schema(subTypes = ...) для объявления всех дочерних типов.Схемы подтипов не создаются. >
Но я не могу добавить эту аннотацию, поскольку во время выполнения (во время запуска) с помощью сопоставителя объектов Джексона регистрируется больше подтипов.
Это делается с помощью Spring Bean, который создает модуль Джексона. это выполняет сканирование пути к классам для типов модели (в основном оно сканирует классы с аннотацией JsonTypeName).
Можно ли добавить эту информацию о наследовании с помощью API Springdoc и/или API Swagger?
data class SubtypesRequest(val elements: List)

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonTypeName("parent")
open abstract class Parent(val name: String)

@JsonTypeName("childX")
@Schema(allOf = [Parent::class])
class ChildX(name: String, val x: String) : Parent(name)

@JsonTypeName("childY")
@Schema(allOf = [Parent::class])
class ChildY(name: String, val y: String) : Parent(name)

Приведенный выше код генерирует схему только для типа Parent, поскольку похоже, что Springdoc/swagger не знает (не может знать) о подтипах ChildX
Приведенный выше код генерирует схему только для типа Parent, поскольку похоже, что Springdoc/swagger не знает (не может знать) о подтипах ChildX
код>, ДетскийY. Но на самом деле это должны быть типы ChildX и ChildY, которые разрешены в качестве типов для элементов списка.
Parent:
required:
- name
- type
type: object
properties:
name:
type: string
type:
type: string
discriminator:
propertyName: type
SubtypesRequest:
required:
- elements
type: object
properties:
elements:
type: array
items:
$ref: '#/components/schemas/Parent'


С аннотированными подтипами это работает
data class SubtypesRequest(val elements: List)

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type"
)
@JsonSubTypes(
JsonSubTypes.Type(value = ChildX::class, name = "childX"),
JsonSubTypes.Type(value = ChildY::class, name = "childY"),
)
@Schema(subTypes = [ChildX::class, ChildY::class])
@JsonTypeName("parent")
open abstract class Parent(val name: String)
@JsonTypeName("childX")
@Schema(allOf = [Parent::class])
class ChildX(name: String, val x: String) : Parent(name)

@JsonTypeName("childY")
@Schema(allOf = [Parent::class])
class ChildY(name: String, val y: String) : Parent(name)

ChildX:
required:
- name
- x
type: object
allOf:
- $ref: '#/components/schemas/Parent'
- type: object
properties:
x:
type: string
ChildY:
required:
- name
- 'y'
type: object
allOf:
- $ref: '#/components/schemas/Parent'
- type: object
properties:
'y':
type: string
Parent:
required:
- name
- type
type: object
properties:
name:
type: string
type:
type: string
discriminator:
propertyName: type
SubtypesRequest:
required:
- elements
type: object
properties:
elements:
type: array
items:
oneOf:
- $ref: '#/components/schemas/ChildX'
- $ref: '#/components/schemas/ChildY'

Я пробовал вручную создавать объекты Schema и регистрировать их в OpenAPI во многих различных вариантах, но без каких-либо результатов. Ниже представлена ​​лишь одна из последних попыток.
@Configuration
class OpenApiConfiguration {
@Bean
fun openApi(): OpenAPI {
val api = OpenAPI()

val parent = ModelConverters.getInstance().read(Parent::class.java)
val childX = ModelConverters.getInstance().read(ChildX::class.java)
val childY = ModelConverters.getInstance().read(ChildY::class.java)

api.schema("Parent", parent.values.first())
api.schema("ChildX", childX.values.first())
api.schema("ChildY", childY.values.first())

return api
}
}



Подробнее здесь: https://stackoverflow.com/questions/760 ... ed-with-js
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»