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

[java] Combining "properties" and "additionalProperties" in one class generates broken Jackson mapping.

Open r-alukhanov opened this issue 5 years ago • 19 comments

Description

If using both "properties" and "additionalProperties", the generated class extends HashMap and contains plain properties. Like this:

public class Example extends HashMap<...>  {
  @JsonProperty("a")
  private String a;
  ...
}

Such a class cannot be meaningfully deserialised using Jackson. Jackson puts all the fields as key/value pairs into the HashMap ignoring the plain fields. In provided example getA() would return "null", while get("a") contains the value.

openapi-generator version

Used version: openapi-generator-maven-plugin : 3.3.3

OpenAPI declaration file
Example:
  type: object
  properties:
    a:
    type: string
  additionalProperties: true
Suggest a fix/enhancement

I would suggest to generate such a class (which has both "properties" and "additionalProperites") as:

public class Example {
  private String a;
  private HashMap<> otherProperties;
  ...
}

Similar suggestion in "swagger-codegen" project: https://github.com/swagger-api/swagger-codegen/issues/5187

r-alukhanov avatar Nov 16 '18 11:11 r-alukhanov

Any updates on this?

cjmamo avatar Apr 09 '19 09:04 cjmamo

We are facing the very same issue using openapi-generator-gradle-plugin : 4.0.1 and the jaxrs-jersey generator.

Are there any workarounds beside not using both (i.e. properties and additionalProperties) at the same time? Are there any plans to fix it?

Thanks!

vandeseer avatar Jul 07 '19 15:07 vandeseer

Also having problems with serialize/deserialize properly because of this. Desired approach would be to populate a mustache flag like {{hasAdditionalProperties}} on class level (not vars level), similar to {{isMapContainer}} which is currently true if additionalProperties: true Then we could use it however we want in mustache to add the otherProperties field and necessary json annotations and builders etc..

The automatic extends HashMap<...> should not be there, instead users can add that themselves in mustasche by checking the {{hasAdditionalProperties}} flag.

FatCash avatar Sep 03 '19 11:09 FatCash

Any updates on this issue?

wakedeer avatar Jul 18 '20 11:07 wakedeer

I think that having a member of HashMap instead of extending HashMap would address the issue. @JsonAnyGetter and @JsonAnySetter are designed for this exactly. Like @FatCash suggested, there could be a feature flag that would allow backward compatibility (though it seems broken right now anyway)

harel-e avatar Aug 13 '20 12:08 harel-e

curious if this was ever fixed?

cgfarmer4 avatar Feb 23 '21 00:02 cgfarmer4

Also having problems with this issue, Any workaround or update ?

B-hamza avatar Feb 24 '21 10:02 B-hamza

Also having problems with this issue, Any workaround or update ?

Hey, Unfortunately not! But you can make customization for it. I have made wrapper over gradle plugin and added some logic. I can share it with you if you are interested in it

wakedeer avatar Feb 24 '21 21:02 wakedeer

@wakedeer I would be interested to see this.

cgfarmer4 avatar Feb 24 '21 21:02 cgfarmer4

This is related to issues 6146 and 5515

harel-e avatar Mar 10 '21 13:03 harel-e

Hello, I faced the same problem. I took a look at the code and it happens that if you use the java generator with configOptions.library set to jersey2 (gradle plugin), it works as you expect.

Unfortunately for me I use the spring generator, I don't know why the behavior hasn't been set for all java generators.

I will maybe propose a fix about that.

benfonty avatar Sep 17 '21 07:09 benfonty

I tried to adapt the fix for spring to the jaxrs-cxf generator. It seems to work fine for our usecase but I am not sure how to prevent this from breaking existing code which may rely on the current behavior. So I am still hesitant to open a pull request.

ssiegler avatar Oct 20 '21 11:10 ssiegler

These changes look really good @benfonty . Is there anything left to get this change accepted?

jameswynn avatar Nov 15 '21 18:11 jameswynn

@benfonty can you try merging master to your branch and push again? That should solve the build issue.

jameswynn avatar Dec 07 '21 21:12 jameswynn

@benfonty can you try merging master to your branch and push again? That should solve the build issue.

@jameswynn CI is indeed OK now.

benfonty avatar Dec 08 '21 08:12 benfonty

Hello @jameswynn / @benfonty ,

Have you a update for this fix please ?

Thank you so much :)

sirimantraore avatar Jan 04 '22 09:01 sirimantraore

Is there anything blocking this from making it into the 6.0 release? @wing328 I can update the PR again.

jameswynn avatar Mar 25 '22 18:03 jameswynn

Hi, this issue is blocking my team as well. @Zomzog , @banlevente , @borsch , @javisst , @cachescrubber , @welshm , @MelleD, @atextor, @manedev79, What is the status on this issue? I tried to contact @jameswynn with no success. I'm happy trying to merge this pull request if need be.

loiccara avatar Sep 14 '22 07:09 loiccara

Hello, is there an issue with the MR for it not to be merged?

WeihmannDev avatar Oct 18 '22 16:10 WeihmannDev