openapi-generator icon indicating copy to clipboard operation
openapi-generator copied to clipboard

[BUG][Kotlin] Openapi structure with oneOf doesn't generate compilable code

Open alitams opened this issue 4 years ago • 4 comments

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
  1. Add this to the constructor in KotlinClientCodegen.java:
useOneOfInterfaces = true
addOneOfInterfaceImports = true
  1. 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}} {

alitams avatar Jun 25 '21 08:06 alitams

I have the same issue. Why has this issue been open for so long without any comment? Is some information missing?

ulrichw-svg avatar Oct 11 '24 13:10 ulrichw-svg

+1 for this issue.

SuhwanJee avatar Mar 31 '25 04:03 SuhwanJee

+1 have to use java client instead because of this missing feature :(

greenarr0w avatar Jul 11 '25 09:07 greenarr0w

Any update regarding this bug?

aldex32 avatar Nov 27 '25 11:11 aldex32