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.35k stars 6.46k forks source link

[BUG] [JAVA] "additionalProperties" does not generate a HashMap Model, openapi: 3.0.2 #7066

Open roostapour opened 4 years ago

roostapour commented 4 years ago
Description

I am using "additionalProperties" in my yaml file as below.

openapi: 3.0.2
....
components:
  schemas:
    Messages:
      type: object
      additionalProperties:
        $ref: '#/components/schemas/Message'
    Message:
      type: object
      properties:
        code:
          type: integer
        text:
          type: string

But when running mvn clean package, no class is being created for Messages. I was expecting to see a class like :

public class Messages extends HashMap<String, Object> {
......
}

in org.openapitools.client.model.Messages the same as other classes generated based on the yaml file. I tried additionalProperties: true and additionalProperties: {} but none of them worked. It seems like a bug

my pom.xml for openapi-generator and swagger versions
<dependency>
  <groupId>io.swagger</groupId>
  <artifactId>swagger-annotations</artifactId>
  <version>1.6.1</version>
</dependency>
....
<plugin>
  <groupId>org.openapitools</groupId>
  <artifactId>openapi-generator-maven-plugin</artifactId>
  <version>4.3.1</version>
  <executions>
    <execution>
      <goals>
        <goal>generate</goal>
      </goals>
        ...
    </execution>
  </executions>
</plugin>
Command line used for generation

mvn clean package

wing328 commented 4 years ago

Please try the option generateAliasAsModel, which will generate array, map as models

roostapour commented 4 years ago

Thanks for your answer @wing328 . I tried both

<configuration>
    <generateAliasAsModel>true</generateAliasAsModel>
</configuration>

and

<configuration>
    <configOptions>
         <generateAliasAsModel>true</generateAliasAsModel> 
    </configOptions>
</configuration>

But none of them worked. How should I set the generateAliasAsModel option?

wing328 commented 4 years ago

Doc: https://github.com/OpenAPITools/openapi-generator/tree/master/modules/openapi-generator-maven-plugin

I think the first one should work ...

roostapour commented 4 years ago

@wing328 I realized if I define a Map of string to string in the yaml file like the following then generateAliasAsModel works.

Messages:
  type: object
  additionalProperties:
    type: string

But if the value is an object or ref (which I need) like the the following then generateAliasAsModel does not work and doesn't generate Messages

Messages:
  type: object
  additionalProperties:
    type: object

or

Messages:
  type: object
  additionalProperties:
    $ref: '#/components/schemas/Message'
roostapour commented 4 years ago

Just to add, I do have the same issue on javascript side. Having the following version in my package.json

"devDependencies": {
    "@openapitools/openapi-generator-cli": "^1.0.13-4.3.1"
}

and running with --generate-alias-as-model flag, with the same yaml file behaves exactly the same as Java side. For Map of string to string it works but for Map of string to object/ref it does not generate the model.

abhijith-prabhakar commented 4 years ago

It is slightly different issue in JAX-RS. I am working on v4.3.1 and OpenAPI v2

It generates Message.java but the pojo where messages are included does not have type information. This generates a compile error.

private Message messages = new HashMap<>();

I traced it to below code on pojo.mustache

private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};

I am not sure how HashMap<> is getting substituted here. Please let me know if you want me to create a separate issue for this

roostapour commented 4 years ago

Can someone please answer this?

wing328 commented 4 years ago

@roostapour based on what you provided, looks like it's a bug. A good starting point is https://github.com/OpenAPITools/openapi-generator/blob/master/modules/openapi-generator/src/main/java/org/openapitools/codegen/utils/ModelUtils.java and search for isGenerateAliasAsModel

yahyavi commented 4 years ago

Hello, We have a similar issue trying to generate a Map from our YAML file (v3). Is there a document/example on how to generate maps/dictionaries properly?

chrylis commented 4 years ago

Confirmed that as of 4.3.1 classes are generated, but:

helango-seabiscuit commented 3 years ago

Any update on the issue? Is this fixed? Facing same issue

Praveen2518 commented 3 years ago

It is slightly different issue in JAX-RS. I am working on v4.3.1 and OpenAPI v2

It generates Message.java but the pojo where messages are included does not have type information. This generates a compile error.

private Message messages = new HashMap<>();

I traced it to below code on pojo.mustache

private {{{datatypeWithEnum}}} {{name}}{{#defaultValue}} = {{{.}}}{{/defaultValue}};

I am not sure how HashMap<> is getting substituted here. Please let me know if you want me to create a separate issue for this

Hi, Did you solve this issue how to remove that hashMap how it is substituting.i am also stuck at this problem and I am using open api 5.1.0 version

JaquelineP commented 2 years ago

Any updates? I tried it with openapi-generator-maven-plugin 5.4.0. and get an compile time error. When adding an item to the hashmap it tries to initialize the Map. Here's a snippet of the generated code: image

MarcelHoell commented 2 years ago

Any updates? I tried it with openapi-generator-maven-plugin 5.4.0. and get an compile time error. When adding an item to the hashmap it tries to initialize the Map. Here's a snippet of the generated code: image

I've got the same problem...

arvindkrishnakumar-okta commented 2 years ago

@wing328 I am encountering the same issue. Do you recommend any workaround/solution here? I see we have something like this in .NET - any similar thing for Java?

jehrenzweig-leagueapps commented 1 year ago

@MarcelHoell @arvindkrishnakumar-okta For each of you, does the non-working Java class that OpenAPI Generator produces contain extends HashMap<K, V> in the class definition? K and V can by any valid types, of course.

AlexandKo commented 1 year ago
Screenshot 2023-01-15 at 18 00 00

I've got the same problem. Used Gradle Plugin version 6.2.1. Any comments. Thank you.

AlexandKo commented 1 year ago

Update to Gradle Plugin version 6.4.0 resolved problem

mybr4inhurts commented 1 year ago

Still exists with maven plugin >6.3.0

Tested with 6.4, 6.5 and 6.6

api-spec.yaml:

        description:
          type: object
          nullable: true
          description: description of the object
          additionalProperties:
            type: string
          example:
            de: Wurst
            en: sausage

generated java code (tested with 6.4, 6.5, 6.6):

    /**
    * description of the object
    **/
    @JsonbProperty("description")
    private Map<String, String> description = ;

generated code with 6.3.0:

    /**
    * description of the object
    **/
    @JsonbProperty("description")
    private Map<String, String> description = null;

pom.xml (working config):

<plugin>
    <groupId>org.openapitools</groupId>
    <artifactId>openapi-generator-maven-plugin</artifactId>
    <version>6.3.0</version>
    <executions>
        <execution>
            <id>generate-api</id>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <generatorName>java</generatorName>
                <generateAliasAsModel>true</generateAliasAsModel>  <-- has no effect though, can be omitted
            </configuration>
        </execution>
    </executions>
</plugin>
wing328 commented 1 year ago

generated java code (tested with 6.4, 6.5, 6.6):

can you please test with the latest master? I did a test but couldn't repeat the issue. The output compiles fine.

typekpb commented 1 year ago

HashMap generation (https://swagger.io/docs/specification/data-models/dictionaries/) in java works in 5.0.0-beta2 version, but is broken in 6.6.0 version.

mimkorn commented 11 months ago

If my understanding is correct, currently it's not possible to have additionalProperties of type object to work in the current java client generator. I do not see any intention to move this forward in the past years — is it a rarely required functionality? Because we sure need it.

DominikBasnerSotec commented 10 months ago

My workaround: string-replace

            <plugin>
                <groupId>io.github.floverfelt</groupId>
                <artifactId>find-and-replace-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>exec-1</id>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>find-and-replace</goal>
                        </goals>
                        <configuration>
                            <!-- Possible replacementType values: file-contents, filenames, directory-names. To run for multiple types, pass the values as a CSV list. -->
                            <replacementType>file-contents</replacementType>
                            <baseDir>target/generated-sources/openapi</baseDir>
                            <findRegex>private DeviceAcl acl = new HashMap&lt;>\(\);</findRegex>
                            <replaceValue>private DeviceAcl acl = new DeviceAcl();</replaceValue>
                            <recursive>true</recursive>
                            <fileMask>.java</fileMask>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

For each line that needs replacement, add an execution

Jofairden commented 7 months ago

Still having this issue in 2024. Sad to see it not picked up at all.

lucar94 commented 6 months ago

I tried with 7.0.0 and 7.3.0 versions and bug seems solved (with 6.6.0 I had the problem).