OpenAPITools / OpenAPITools/openapi-generator
[BUG][Kotlin] Openapi structure with oneOf doesn't generate compilable code
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 26.8k
- Forks
- 7.7k
- PR merge metrics
- PR metrics pending
Description
Bug Report Checklist
- Have you provided a full/minimal spec to reproduce the issue?
- Have you validated the input using an OpenAPI validator (example)?
- Have you tested with the latest master to confirm the issue still exists?
- Have you searched for related issues/PRs?
- What's the actual output vs expected output?
- [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description
The models doesn't implement the discriminator interface.
See:
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes(
JsonSubTypes.Type(value = Plane::class, name = "PLANE"),
JsonSubTypes.Type(value = Ship::class, name = "SHIP"),
JsonSubTypes.Type(value = Truck::class, name = "TRUCK")
)
interface Vehicle {
}
data class Ship (
@field:JsonProperty("weight")
val weight: java.math.BigDecimal,
@field:JsonProperty("sailLength")
val sailLength: java.math.BigDecimal
)
The ship should be generated to this:
data class Ship (
@field:JsonProperty("weight")
val weight: java.math.BigDecimal,
@field:JsonProperty("sailLength")
val sailLength: java.math.BigDecimal
) : Vehicle
openapi-generator version
5.1.1
OpenAPI declaration file content or url
Check this code: https://gist.github.com/alitams/0df475eba74770f70954bf132a583afc
Generation Details
generatorName: kotlin
outputDir: samples/client/petstore/kotlin-jackson
inputSpec: modules/openapi-generator/src/test/resources/2_0/petstore.yaml
templateDir: modules/openapi-generator/src/main/resources/kotlin-client
additionalProperties:
serializationLibrary: jackson
Steps to reproduce
Generate the yaml above with the given configuration.
Suggest a fix
- Add this to the constructor in KotlinClientCodegen.java:
useOneOfInterfaces = true
addOneOfInterfaceImports = true
- Modify the 55th line number in data_class.mustache with this (add vendorExtensions.x-implements items):
){{/discriminator}}{{#parent}}{{^serializableModel}}{{^parcelizeModels}}{{^vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{^parcelizeModels}}{{^vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{^serializableModel}}{{#parcelizeModels}}{{^vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Parcelable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{#parcelizeModels}}{{^vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable, Parcelable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{^parcelizeModels}}{{^vendorExtensions.x-implements}} : Serializable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{^serializableModel}}{{#parcelizeModels}}{{^vendorExtensions.x-implements}} : Parcelable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{#parcelizeModels}}{{^vendorExtensions.x-implements}} : Serializable, Parcelable{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{^serializableModel}}{{^parcelizeModels}}{{^vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{^parcelizeModels}}{{#vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{^serializableModel}}{{#parcelizeModels}}{{#vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Parcelable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#parent}}{{#serializableModel}}{{#parcelizeModels}}{{#vendorExtensions.x-implements}} : {{{parent}}}{{#isMap}}(){{/isMap}}{{#isArray}}(){{/isArray}}, Serializable, Parcelable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{^parcelizeModels}}{{#vendorExtensions.x-implements}} : Serializable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{^serializableModel}}{{#parcelizeModels}}{{#vendorExtensions.x-implements}} : Parcelable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{#serializableModel}}{{#parcelizeModels}}{{#vendorExtensions.x-implements}} : Serializable, Parcelable, {{{.}}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{^parent}}{{^serializableModel}}{{^parcelizeModels}}{{#vendorExtensions.x-implements}}{{#-first}}: {{{.}}}{{/-first}}{{^-first}}, {{{.}}}{{/-first}}{{#-last}} {{/-last}}{{/vendorExtensions.x-implements}}{{/parcelizeModels}}{{/serializableModel}}{{/parent}}{{#vendorExtensions.x-has-data-class-body}} {
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.
Research direction
Reproduce the Kotlin generation using the linked OpenAPI declaration and the stated Jackson configuration. Start in KotlinClientCodegen.java and data_class.mustache, then inspect how oneOf interfaces and vendorExtensions.x-implements are handled. Done means generated classes such as Ship implement Vehicle and produce compilable Kotlin code.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java, kotlin, openapi
- Domain
- backend-api-design, tooling
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 45/100