Created by: bkabrda
This PR represents implementation of oneOf support for Java clients that use Jackson as serialization library. I based this on discussion in #15.
This implements oneOf in the following way:
- The object/property that holds
oneOfmapping is generated as aninterfacewith proper jacksonJsonSubTypesdecorator derived fromdiscriminator- this makes it possible for jackson to detect the implementing class that should be used when deserializing. - The objects referenced in
oneOfimplement this interface. - A getter for the discriminator attribute is generated in the above mentioned interface, making it easy to write code such as (assuming the API response contains
x, which is theoneOfinterface):if (x.getType() == "type1") { Type1 type1 = (Type1) x }; - If there are any additional properties defined on the
oneOf-containing object, they are added to all of theoneOfmembers.
Limitations:
- Doesn't work with inline-defined (non-ref) members of
oneOf. - Doesn't work if discriminator is not used (more specifically, it won't be able to deserialize API responses, as the
JsonSubTypesdecorator on the interface will be empty). - Currently it is assumed that the discriminator property has
stringtype (this could probably be fixed).
I'll appreciate any feedback on this and will be happy to implement more improvements if someone has suggestions.
PR checklist
-
Read the contribution guidelines. -
If contributing template-only or documentation-only changes which will change sample output, build the project before. -
Run the shell script(s) under ./bin/(or Windows batch scripts under.\bin\windows) to update Petstore samples related to your fix. This is important, as CI jobs will verify all generator outputs of your HEAD commit, and these must match the expectations made by your contribution. You only need to run./bin/{LANG}-petstore.sh,./bin/openapi3/{LANG}-petstore.shif updating the code or mustache templates for a language ({LANG}) (e.g. php, ruby, python, etc). -
File the PR against the correct branch: master,4.3.x,5.0.x. Default:master. -
Copy the technical committee to review the pull request if your PR is targeting a particular programming language.
@bbdouglas (2017/07) @sreeshas (2017/08) @jfiala (2017/08) @lukoyanov (2017/09) @cbornet (2017/09) @jeff9finger (2018/01) @karismann (2019/03) @Zomzog (2019/04) @lwlee2608 (2019/10)