Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Conditionally apply serialization on certain properties #9807

Merged
merged 11 commits into from
Jun 29, 2021

Conversation

Ghufz
Copy link
Contributor

@Ghufz Ghufz commented Jun 18, 2021

ConditionalSerialization is exposed as flag when it sets to true it generates the shouldSerialize() method for each property along with flag which detect that property has been changes or set, if the property has been changed then the flag is set to true and ShouldSerialize return true, which allows the serialization that configured property in request body.

-This gives a control to the user to decide what are the properties can be set in request body irrespective of sending all the other property which user does not configured.

We face the issue mostly in the case of update the MO, where user wants to configure only one property but in the request all the nulllable properties set to null. which leads to inconsistency.

-This solved another use case where user is using the latest SDK which has newly added property to the existing object and the server side is not updated(working with older openAPIDoc). When user tries to send the request to the server the newly added property also become a part of request body which server does not know abut it, it leads to exception. ConditionalSerialization will not include those newly added property unless and until it is being configured by the user.

Here is the example :-
Let say we have Name object which has two properties FirstName and LastName

when user wants to create new Name object the request would be like

{
     "FirstName": "Tom",
      "LastName" : "Harry"
}

once above object is created let say user wants to update only "LastName" so the payload as per the deafult Csharp SDK would be

{
  "FirstName" :  null,
  "LastName" :  "Xyz"
}

When the above request sents to the server, it updates the firstName as null along with LastName which leads to inconsistency.
when we generate the C# SDK using the conditionalSerialization flag the above request cant be sent like below

{
     "LastName" : "Xyz"
}

the above request sends only those property which user has configured.

Note :- there is no change in default code generation.

PR checklist

  • Read the contribution guidelines.
  • Pull Request title clearly describes the work in the pull request and Pull Request description provides details about how to validate the work. Missing information here may result in delayed response from the community.
  • Run the following to build the project and update samples:
    ./mvnw clean package 
    ./bin/generate-samples.sh
    ./bin/utils/export_docs_generators.sh
    
    Commit all changed files.
    This is important, as CI jobs will verify all generator outputs of your HEAD commit as it would merge with master.
    These must match the expectations made by your contribution.
    You may regenerate an individual generator by passing the relevant config(s) as an argument to the script, for example ./bin/generate-samples.sh bin/configs/java*.
    For Windows users, please run the script in Git BASH.
  • File the PR against the correct branch: master, 5.1.x, 6.0.x
  • If your PR is targeting a particular programming language, @mention the technical committee members, so they are more likely to review the pull request.
    @wing328

@wing328
Copy link
Member

wing328 commented Jun 19, 2021

cc @mandrean (2017/08) @frankyjuang (2019/09) @shibayan (2020/02) @Blackclaws (2021/03) @lucamazzanti (2021/05)

@wing328 wing328 added this to the 5.2.0 milestone Jun 27, 2021
@wing328
Copy link
Member

wing328 commented Jun 27, 2021

Removed some trailing spaces and updated the samples via 14cc482

@wing328
Copy link
Member

wing328 commented Jun 29, 2021

CI failures not related to this change.

@wing328 wing328 merged commit 90233d6 into OpenAPITools:master Jun 29, 2021
@wing328 wing328 changed the title conditional serialization add only those property which user wants to… Conditionally apply serialization on certain properties Jul 9, 2021
@roderickgreen
Copy link

Thanks for the feature @Ghufz. I was excited to see this because I have a similar issue to resolve. Unfortunately this doesn't cover my use case. I am making heavy use of model construction via ctors, and the ctors don't write to the properties. So after I enabled this option, none of my properties get serialized. Do you have any thoughts about this from the work you put in? If the parameterless ctor was public I could initialize the models with object initializers, but that might break some of the IsRequired checking.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants