swagger-api / swagger-api/swagger-codegen
[Java] Inconsistent polymorphism in components and responses
@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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.