swagger-api / swagger-api/swagger-codegen

[Java] Inconsistent polymorphism in components and responses

Open
#9,799 0 comments 0 reactions 1 assignee View on GitHub

@HugoMario is already working on this.

Since May 8, 2020.

Dominant language
Mustache
Stars
17.8k
Forks
6k
PR merge metrics
No merged PRs in 30d

Description

Description

Polymorphism works inconsistently between model and API generation (or between components and responses in schema):
Let's say we have base entity Pet and it's children Cat and Dog.
Component Pets that's defined as

    Pets:
      type: array
      items:
        oneOf:
          - $ref: "#/components/schemas/Dog"
          - $ref: "#/components/schemas/Cat"

is correctly treated as ArrayList

However similar definition in responses

         content:
            application/json:
              schema:
                type: array
                items:
                  oneOf:
                    - $ref: "#/components/schemas/Cat"
                    - $ref: "#/components/schemas/Dog"

generates List as a return type. The workaround is to add intermediate container Pets, but I guess the behavior should be consistent in components and responses.

Swagger-codegen version

3.0.13, reproducible on 3.0.14

Swagger declaration file content or url
openapi: "3.0.0"

info:
  version: 1.0.0
  title: Swagger Petstore
  license:
    name: MIT

servers:
  - url: http://petstore.swagger.io/v1

paths:
  /pets:
    get:
      summary: List all pets
      operationId: listPets
      tags:
        - pets
      parameters:
        - name: limit
          in: query
          description: How many items to return at one time (max 100)
          required: false
          schema:
            type: integer
            format: int32
      responses:
        '200':
          description: A paged array of pets
          headers:
            x-next:
              description: A link to the next page of responses
              schema:
                type: string
          content:
            application/json:    
              schema:
                $ref: "#/components/schemas/Pets"
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"
    post:
      summary: Create a pet
      operationId: createPets
      tags:
        - pets
      responses:
        '201':
          description: Null response
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /pets2:
    get:
      summary: List all pets
      operationId: listPets
      tags:
        - pets
      parameters:
        - name: limit
          in: query
          description: How many items to return at one time (max 100)
          required: false
          schema:
            type: integer
            format: int32
      responses:
        '200':
          description: A paged array of pets
          headers:
            x-next:
              description: A link to the next page of responses
              schema:
                type: string
          content:
            application/json:
              schema:
                type: array
                items:
                  oneOf:
                    - $ref: "#/components/schemas/Cat"
                    - $ref: "#/components/schemas/Dog"
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

  /pets/{petId}:
    get:
      summary: Info for a specific pet
      operationId: showPetById
      tags:
        - pets
      parameters:
        - name: petId
          in: path
          required: true
          description: The id of the pet to retrieve
          schema:
            type: string
      responses:
        '200':
          description: Expected response to a valid request
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Pet"
        default:
          description: unexpected error
          content:
            application/json:
              schema:
                $ref: "#/components/schemas/Error"

components:
  schemas:
    Pet:
      type: object
      required:
        - id
        - name
        - petType
      properties:
        id:
          type: integer
          format: int64
        name:
          type: string
        tag:
          type: string
        petType:
          type: string

    Dog:
      allOf:
        - $ref: "#/components/schemas/Pet"
        - type: object
          properties:
            barks:
              type: boolean

    Cat:
      allOf:
        - $ref: "#/components/schemas/Pet"
        - type: object
          properties:
            meows:
              type: boolean

    Pets:
      type: array
      items:
        oneOf:
          - $ref: "#/components/schemas/Dog"
          - $ref: "#/components/schemas/Cat"

    Error:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: integer
          format: int32
        message:
          type: string
Command line used for generation

generate -l java -Dmodels -Dapis -i petstore.yaml

Steps to reproduce

Generate Java code from schema above, in PetsApi.java:
/pets returns Pets (where Pets extends ArrayList)
/pets1 returns List

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.