Openapi-generator: [BUG] [spring][server] oneOf Polymorphism support for spring boot

Created on 20 Feb 2020  路  5Comments  路  Source: OpenAPITools/openapi-generator

Description

Currently, openapi-generator doesn't support oneOf. It currently generates the following broken code, outputting UNKNOWN_BASE_TYPE rather than Pet for the example below.
The code is broken with or without the discriminator in the Spec.

    default ResponseEntity<Void> _petsPost(@ApiParam(value = ""  )  @Valid @RequestBody(required = false) UNKNOWN_BASE_TYPE UNKNOWN_BASE_TYPE) {
        return petsPost(UNKNOWN_BASE_TYPE);
    }
openapi-generator version

pom.xml

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>4.2.3</version>
    <executions>
        <execution>
            <id>generate</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <inputSpec>${project.basedir}/src/main/resources/api.yaml</inputSpec>
                <generatorName>spring</generatorName>
                <generateSupportingFiles>true</generateSupportingFiles>
                <configOptions>
                    <sourceFolder>src/gen/java/main</sourceFolder>
                    <library>spring-boot</library>
                    <java8>true</java8>
                    <interfaceOnly>true</interfaceOnly>
                    <skipDefaultInterface>false</skipDefaultInterface>
                    <delegatePattern>true</delegatePattern>
                </configOptions>
            </configuration>
        </execution>
    </executions>
</plugin>
OpenAPI Spec

api.yaml

openapi: "3.0.2"
info:
  version: 1.0.0
  title: Polymorphism
paths:
  /pets:
    post:
      requestBody:
        content:
          application/json:
            schema:
              oneOf:
                - $ref: '#/components/schemas/Cat'
                - $ref: '#/components/schemas/Dog'
              discriminator:
                propertyName: pet_type
      responses:
        '200':
          description: created
components:
  schemas:
    # Parent
    Pet:
      type: object
      required:
        - pet_type      
      properties:
        pet_type:
          type: string
        eats:
          type: string
      discriminator:
        propertyName: pet_type
    # Child 1
    Dog:
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          # all other properties specific to a `Dog`
          properties:
            bark:
              type: boolean
    # Child 2
    Cat:
      allOf:
        - $ref: '#/components/schemas/Pet'
        - type: object
          # all other properties specific to a `Cat`
          properties:
            climbs:
              type: boolean
Command line used for generation
Steps to reproduce
  • create a pom.xml with openapi-generator-maven-plugin 4.2.3
  • create api.yaml file above
  • mvn clean compile
  • see broken code under target directory \target\generated-sources\openapi\src\gen\java\main\org\openapitools\api\PetsApi.java
Related issues/PRs

This bug is related to the Server side Java code (SpringBoot)
@bkabrda has already merged PR for client Jackson Client side: https://github.com/OpenAPITools/openapi-generator/pull/5120

Suggest a fix

Try apply client side fix from https://github.com/OpenAPITools/openapi-generator/pull/5120 to server side.

Bug Spring

Most helpful comment

@bkabrda Hey! Do you know if there are any updates on this issue? It would be really nice to have this feature :)

All 5 comments

馃憤 Thanks for opening this issue!
馃彿 I have applied any labels matching special text in your issue.

The team will review the labels and make any necessary changes.

Line it's failing on DefaultCodegen.java#L5404

@bkabrda Any pointers on possible fix here? I assume SpringCodegen needs to postProcess the model in some way to configure the Base interface/class to use for each anyOf schema?
https://github.com/OpenAPITools/openapi-generator/blob/ea55968737fa80a3e306d1b08032ff4d911774c9/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/SpringCodegen.java#L585

@dkirrane hey 馃憢 so in order to use the whole oneOf machinery I implemented, you'll need to do couple of things (your previous comment says "anyOf", but I think that's a typo and should have been "oneOf" - what I did only supports oneOf right now):

  • The generator needs to set useOneOfInterfaces = true (and since it's Java, you'll also have to add addOneOfInterfaceImports = true).
  • If the generator class (or any superclass of the generator class) overrides preprocessOpenAPI and/or postProcessAllModels, you need to make sure they call super.<theMethod> so that the whole machinery is actually called.
  • You'll likely also need to implement a addImportsToOneOfInterface method on the generator (take a look at JavaClientCodegen, I'd think that it would contain pretty much what you need, maybe you could even move it to AbstractJavaCodegen and get that shared for the server codegen).

Let me know if this helps. Thanks!

@bkabrda Hey! Do you know if there are any updates on this issue? It would be really nice to have this feature :)

Hello @bkabrda !! Would be great if your java client oneOf interface behaviour is extended to all java generators ...
Any update or by-pass available today ?
Thanks

Was this page helpful?
0 / 5 - 0 ratings