openapi-generator
openapi-generator copied to clipboard
[BUG][Kotlin] Openapi structure with oneOf doesn't generate compilable code
Bug Report Checklist
- [x] Have you provided a full/minimal spec to reproduce the issue?
- [x] Have you validated the input using an OpenAPI validator (example)?
- [x] Have you tested with the latest master to confirm the issue still exists?
- [x] Have you searched for related issues/PRs?
- [x] 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}} {
I have the same issue. Why has this issue been open for so long without any comment? Is some information missing?
+1 for this issue.
+1 have to use java client instead because of this missing feature :(
Any update regarding this bug?