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

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

Open roostapour opened this issue 5 years ago • 15 comments

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

roostapour avatar Jul 28 '20 21:07 roostapour

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

wing328 avatar Jul 29 '20 02:07 wing328

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?

roostapour avatar Jul 29 '20 08:07 roostapour

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

I think the first one should work ...

wing328 avatar Jul 29 '20 09:07 wing328

@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 avatar Jul 29 '20 18:07 roostapour

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.

roostapour avatar Jul 30 '20 00:07 roostapour

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

abhijith-prabhakar avatar Jul 30 '20 23:07 abhijith-prabhakar

Can someone please answer this?

roostapour avatar Aug 06 '20 22:08 roostapour

@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

wing328 avatar Aug 07 '20 01:08 wing328

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?

yahyavi avatar Aug 14 '20 07:08 yahyavi

Confirmed that as of 4.3.1 classes are generated, but:

  • The classes incorrectly extend CollectionType<Object> instead of whatever they're a collection of.
  • The above-mentioned initializer error.
  • When the classes are referred to in code, they're replaced with Object.
  • The buggy behavior applies to array-of types in addition to additionalProperties.

chrylis avatar Aug 18 '20 18:08 chrylis

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

helango-seabiscuit avatar May 19 '21 00:05 helango-seabiscuit

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

Praveen2518 avatar Sep 17 '21 21:09 Praveen2518

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

JaquelineP avatar Mar 04 '22 10:03 JaquelineP

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

MarcelHoell avatar Apr 26 '22 10:04 MarcelHoell

@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?

arvindkrishnakumar-okta avatar Aug 09 '22 22:08 arvindkrishnakumar-okta

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

jehrenzweig-leagueapps avatar Nov 16 '22 19:11 jehrenzweig-leagueapps

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 avatar Jan 15 '23 16:01 AlexandKo

Update to Gradle Plugin version 6.4.0 resolved problem

AlexandKo avatar Feb 21 '23 09:02 AlexandKo

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>

mybr4inhurts avatar May 15 '23 06:05 mybr4inhurts

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.

wing328 avatar May 24 '23 07:05 wing328

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.

typekpb avatar Jul 18 '23 12:07 typekpb

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.

mimkorn avatar Oct 11 '23 08:10 mimkorn

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

DominikBasnerSotec avatar Nov 14 '23 12:11 DominikBasnerSotec

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

Jofairden avatar Jan 27 '24 22:01 Jofairden

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

lucar94 avatar Mar 01 '24 19:03 lucar94