OpenAPITools / openapi-generator

OpenAPI Generator allows generation of API client libraries (SDK generation), server stubs, documentation and configuration automatically given an OpenAPI Spec (v2, v3)
https://openapi-generator.tech
Apache License 2.0
21.88k stars 6.59k forks source link

[BUG][java][spring][oneOf] imports that do not exist #4849

Open skchande opened 4 years ago

skchande commented 4 years ago
Description

I am using openapi-codegen version 4.2.2 and openapi specification 3.0.0 on a Windows 10 Enterprise 64bit system to generate a java server API from a yaml file. I also opened a stackoverflow question to get a possible answer. But currently I'm not sure if I have to look for the error at my place or at openapi-codegen. Therefore I have opened my first issue here today. If this is not desired, you are welcome to close the issue. It can be found here.

The problem I encounter is, that the generated code tries to import a class that does not exist. The API should accept an object of type pet and return the same pet, but it should also work with all three subtypes of Pet - Dog, Cat, Lizard.

The code generator tries to import the following classes that it did not generated:

import org.openapitools.model.OneOfCatDogLizard;
import org.openapitools.model.OneOfPet;

Furthermore the generator has generated some classes which I cannot understand at my current state of knowledge

CatAllOf.java
DogAllOf.java
LizardAllOf.java

I tried using the inheritence example from the openapi specification and build the following yaml file from it:

openapi-generator version
openapi-codegen version 4.2.2
OpenAPI declaration file content or url
openapi: 3.0.0
info:
  version: 1.0.0
  title: Three Pets
  termsOfService: http://swagger.io/terms
tags:
  - name: test
paths:
  /echoPet:
    post:
      tags:
        - test
      summary: Return input
      description: Send pet get pet
      operationId: echoPet
      parameters:
        - name: pet
          in: query
          schema:
            oneOf:
              - $ref: '#/components/schemas/Cat'
              - $ref: '#/components/schemas/Dog'
              - $ref: '#/components/schemas/Lizard'
      responses:
        "200":
          description: Pet sucesfully returned
          content:
            application/json:
                schema:
                  oneOf:
                    - $ref: '#/components/schemas/Pet'
servers:
  - url: https://localhost:8080/v2
  - url: http://localhost:8080/v2
components:
  schemas:
    Pet:
      type: object
      required:
      - pet_type
      properties:
        pet_type:
          type: string
      discriminator:
        propertyName: pet_type
        mapping:
          cachorro: Dog
    Cat:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Cat`
        properties:
          name:
            type: string
          huntingSkill:
            type: string
            description: The measured skill for hunting
            enum:
            - clueless
            - lazy
            - adventurous
            - aggressive
    Dog:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Dog`
        properties:
          bark:
            type: string
          packSize:
            type: integer
            format: int32
            description: the size of the pack the dog is from
            default: 0
            minimum: 0
    Lizard:
      allOf:
      - $ref: '#/components/schemas/Pet'
      - type: object
        # all other properties specific to a `Lizard`
        properties:
          lovesRocks:
            type: boolean

I validated the yaml file with openapi-generator, but found no error or warning:

$ openapi-generator validate -i test.yaml Validating spec (test.yaml) No validation issues detected.

Command line used for generation
openapi-generator generate -i test.yaml -g spring -o /tmp/springTest
Steps to reproduce
  1. create a yaml file with the content above
  2. use the command line seen above to generate java code
Related issues/PRs

The same behaviour can be observed, if you generate a server API with the following command, for jaxrs-cxf:

 openapi-generator generate -i test.yaml -g jaxrs-cxf -o /tmp/jaxrs
Suggest a fix/enhancement

Regards, skchande

auto-labeler[bot] commented 4 years ago

👍 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.

rgembalik commented 4 years ago

Any news on this one? I have a similar problem in the javascript generator - creating e.g. require('./OneOfstringnull') reference, but without generating actual OneOfstringnull.js model.

dummyalias commented 4 years ago

FYI: I have a similar construct in a project and it works with version 3.3.4, but not with 4.2.3. I'm using the jaxrs-jersey generator.

May be related to #3692 and #2906.

I'm not familiar with the code, but this line looks like the feature is not finished yet: https://github.com/OpenAPITools/openapi-generator/blob/466bacb30823bfd195f3253386f317cc3c8f65be/modules/openapi-generator/src/main/java/org/openapitools/codegen/DefaultCodegen.java#L108

dummyalias commented 4 years ago

For Java clients this issue seems to be fixed with #5120. Maybe this fix could be applied to Java server generators...

Maybe it would be a good idea to revert the code that refers to the OneOf... models, so that we have the (working) state of version 3.3.4 here. Until someone is willing to put in the work of porting #5120 to the server generators, that is.

skchande commented 4 years ago

The update to 4.3.0 does not seem to fix the issue. With the generated Spring code, the file EchoPetApi.java is broken, because of the two not existing files:

import org.openapitools.model.OneOfCatDogLizard;
import org.openapitools.model.OneOfPet;

In the generated jaxrs-cxf version two files are broken because of the two missing imports.

mmmsalo commented 4 years ago

Any updates/workaround on this?

eratio08 commented 2 years ago

Looks like this is resolve in v6.0.0

lyahim commented 5 months ago

I've faced similar issue with

org.openapitools openapi-generator-maven-plugin 6.6.0

It is possible related to 'REF_AS_PARENT_IN_ALLOF=true' normalizer function, because without that code generated well. For me help to turn on useOneOfInterfaces: <useOneOfInterfaces>true</useOneOfInterfaces>