Skip to content

PolymorphicModelConverter only handles direct subtypes and misses indirect.  #2603

Closed
@aykborstelmann

Description

@aykborstelmann

Describe the bug

For a polymorphic api with 3 hierarchy levels (super, intermediate and child) the oneOfs for super are only generated for intermediate and not for child.

To Reproduce
Assume the following api model.

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type")
@JsonSubTypes({
  @Type(value = IntermediateClass.class, name = IntermediateClass.SCHEMA_NAME),
})
public sealed class Superclass permits IntermediateClass {

  public Superclass() {}
}

@Schema(name = IntermediateClass.SCHEMA_NAME)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "@type")
@JsonSubTypes({
  @Type(value = FirstChildClass.class, name = FirstChildClass.SCHEMA_NAME),
  @Type(value = SecondChildClass.class, name = SecondChildClass.SCHEMA_NAME)
})
public sealed class IntermediateClass extends Superclass permits FirstChildClass, SecondChildClass {

  public static final String SCHEMA_NAME = "IntermediateClass";
}

@Schema(name = FirstChildClass.SCHEMA_NAME)
public final class FirstChildClass extends IntermediateClass {

  public static final String SCHEMA_NAME = "Image";
}

@Schema(name = SecondChildClass.SCHEMA_NAME)
public final class SecondChildClass extends IntermediateClass {

  public static final String SCHEMA_NAME = "Mail";
}

AFAIU the correct @JsonSubTypes annotations (w.r.t. spring doc) only include subtypes for the direct subclass (Correct me if I am wrong).
However with this hierarchy if we have a spring controller with Superclass as response type, the generated oneOf statement in the yaml looks the following:

oneOf:
- $ref: '#/components/schemas/Superclass'
- $ref: '#/components/schemas/IntermediateClass'

However, one would expect (and e.g. our frontend generator otherwise produces wrong clients)

oneOf:
- $ref: '#/components/schemas/Superclass'
- $ref: '#/components/schemas/IntermediateClass'
- $ref: '#/components/schemas/FirstChildClass'
- $ref: '#/components/schemas/SecondChildClass'

What version of spring-boot you are using: 3.2.5
What modules and versions of springdoc-openapi are you using: 2.5.0 [springdoc-openapi-starter-common, springdoc-openapi-starter-webmvc-api and springdoc-openapi-starter-webmvc-ui]

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions