-
-
Notifications
You must be signed in to change notification settings - Fork 6.8k
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
[BUG][Java][client] Erroneous support for nullable attributes #3435
Comments
👍 Thanks for opening this issue! The team will review the labels and make any necessary changes. |
Ok, so a potential way to go forward that I can see: I will be detailing this out using jackson, since it seems to me that it would make it easier to implement than gson. Scenario 4 (from the original issue report) is easy to solve, just mark the variable with Scenario 3 is a little bit complicated, but I think it could be solved like this:
Deserialization should work out-of-the-box, since (IIUC) the setter is called if (and only if) the field is in the API response. Hence if the field is not in the API response, setter won't be called and the Optional will be "empty" (=> so even followup serialization of the same object will still work ok). Does that make sense? I think this is easy enough that I could send a PR myself to implement it (for jackson). |
Phew, that would be (in my opinion) really ugly to create a new Optional. I would go as far as saying it is an 8+ feature only since older java versions are no longer officially supported I would not bother with making something ugly just to support some unsupported language versions. The Idea of using a Monad to box the optional One big issue not using Optional is that Optional is a final class without an interface so all methods which are working with the Java-Implementation wouldn't work with the new implemented Optional. |
In the Spring codegen, we use a custom wrapper called |
Bug Report Checklist
modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml
can be used to reproduce this.nullable
,null
is never sent.Description
The problem is very similar to what was described in [1] - if an attribute is marked as
nullable
in the OpenAPI spec, it's not actually possible to send anull
value in a POST/PUT request for it (using okhttp/gson client, but AFAICS other clients would have these issues as well).openapi-generator version
4.0.2, but the issue seems to always have been there.
OpenAPI declaration file content or url
modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml
Command line used for generation
openapi-generator -g java -i modules/openapi-generator/src/test/resources/3_0/petstore-with-fake-endpoints-models-for-testing.yaml -o /tmp/petstore/
Steps to reproduce
You just need to generate a Java client for OpenAPI spec that has any nullable attributes and see that it doesn't really send nulls for them in the request JSON objects.
Related issues/PRs
[1] #522
[2] #3371
Suggest a fix
My solution for Go from [2], which I believe is correct, considers 4 different states for every attribute:
All these 4 states need to be covered properly in order to be able to send the requests correctly according to the spec. Here's my thinking on how the 4 above scenarios should behave:
null
value is explicit or not; if this flag is true and the attribute is null, it would get serialized as null; if this flag is false and the attribute is null, it wouldn't get serialized at allI propose that an
{{name}}isExplicitNull
attribute is added to the POJO class for every nullable attribute (defaultin tofalse
as well asset{{name}}IsExplicitNull
andis{{name}}ExplicitNull
setter/getter. In addition to that, we'd need to add custom serialization logic that would respect these "explicit null flags" to properly serialize the request.I'm also fairly certain that this can be done as a backwards compatible change, since it will only be adding things, not removing or changing the current API of the generated classes.
The text was updated successfully, but these errors were encountered: