swagger-core icon indicating copy to clipboard operation
swagger-core copied to clipboard

Composite schema (Inheritance) as example

Open picklesdog70 opened this issue 3 years ago • 0 comments

I have one abstract class and three other subclass. I would like that this three subclasses showed as example on the OpenAPI UI. It's possible?

The OpenApi UI show only the abstract class fields and the fields of first subclass.

image

Spring boot version: 2.5.5 springdoc-openapi version: 1.5.10

OperationRequest

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "subType", visible = true)
@JsonSubTypes({
        @JsonSubTypes.Type(value = InstallmentOperationRequest.class, name = "I"),
        @JsonSubTypes.Type(value = CreditCardOperationRequest.class, name = "C"),
        @JsonSubTypes.Type(value = SingleOperationRequest.class, name = "S")
})
@Schema(
        description = "Parent operation request",
        discriminatorProperty = "subType",
        discriminatorMapping = {
                @DiscriminatorMapping(value = "SingleOperation", schema = SingleOperationRequest.class),
                @DiscriminatorMapping(value = "InstallmentOperation", schema = InstallmentOperationRequest.class),
                @DiscriminatorMapping(value = "CreditCardOperation", schema = CreditCardOperationRequest.class)
        })
public abstract class OperationRequest {

    private String description;
    private OperationTypeEnum type;
    private OperationSubTypeEnum subType;
    private BigDecimal value;
    private String observations;

}

CreditCardOperationRequest

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonTypeName("C")
@Schema(allOf = OperationRequest.class)
public class CreditCardOperationRequest extends OperationRequest {

    private String creditCard;
    private LocalDate creditCardOperationDate;
    private Integer creditCardInstallments;

}

SingleOperationRequest

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonTypeName("S")
@Schema(allOf = OperationRequest.class)
public class SingleOperationRequest extends OperationRequest{

    private BigDecimal paidValue;
    private YearMonth period;
}

InstallmentOperationRequest

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonTypeName("I")
@Schema(allOf = OperationRequest.class)
public class InstallmentOperationRequest extends OperationRequest{

    private Integer installments;
    private YearMonth initialInstallment;
}

Generated Json

...
 "components": {
    "schemas": {
      "CreditCardOperationRequest": {
        "required": [
          "creditCard",
          "creditCardInstallments",
          "description",
          "subType",
          "type",
          "value"
        ],
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/OperationRequest"
          },
          {
            "type": "object",
            "properties": {
              "creditCard": {
                "type": "string",
                "description": "Credit card identification",
                "example": "abcd"
              },
              "creditCardOperationDate": {
                "type": "string",
                "description": "Credit card operation date",
                "format": "date",
                "example": "2021-01-10"
              },
              "creditCardInstallments": {
                "minimum": 1,
                "type": "integer",
                "description": "Number of credit card installments",
                "format": "int32",
                "example": 5
              }
            }
          }
        ]
      },
      "InstallmentOperationRequest": {
        "required": [
          "description",
          "initialInstallment",
          "installments",
          "subType",
          "type",
          "value"
        ],
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/OperationRequest"
          },
          {
            "type": "object",
            "properties": {
              "installments": {
                "minimum": 2,
                "type": "integer",
                "description": "Number of installments",
                "format": "int32",
                "example": 5
              },
              "initialInstallment": {
                "type": "string",
                "description": "Initial installment period",
                "example": "2021-01"
              }
            }
          }
        ]
      },
      "OperationRequest": {
        "required": [
          "description",
          "subType",
          "type",
          "value"
        ],
        "type": "object",
        "properties": {
          "description": {
            "type": "string",
            "description": "Operation description",
            "example": "abc"
          },
          "type": {
            "type": "string",
            "description": "Operation type",
            "enum": [
              "I",
              "E"
            ]
          },
          "subType": {
            "type": "string",
            "description": "Operation subType",
            "enum": [
              "S",
              "C",
              "I"
            ]
          },
          "value": {
            "type": "number",
            "description": "Operation value",
            "format": "double",
            "example": 32.56
          },
          "observations": {
            "maxLength": 2147483647,
            "minLength": 2,
            "type": "string",
            "description": "Observations",
            "example": "abc"
          }
        },
        "description": "Parent operation request",
        "discriminator": {
          "propertyName": "subType"
        }
      },
      "SingleOperationRequest": {
        "required": [
          "description",
          "paidValue",
          "subType",
          "type",
          "value"
        ],
        "type": "object",
        "allOf": [
          {
            "$ref": "#/components/schemas/OperationRequest"
          },
          {
            "type": "object",
            "properties": {
              "paidValue": {
                "type": "number",
                "description": "Operation paid value",
                "example": 12.56
              },
              "period": {
                "type": "string",
                "description": "Operation period",
                "example": "2021-01"
              }
            }
          }
        ]
      }
       ...
    }
  }
  ...

picklesdog70 avatar Jan 26 '22 00:01 picklesdog70