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

[Java] "allOf" no longer supports inheritance AND composition #1358

Closed
clintfoster opened this issue Oct 31, 2018 · 6 comments
Closed

[Java] "allOf" no longer supports inheritance AND composition #1358

clintfoster opened this issue Oct 31, 2018 · 6 comments

Comments

@clintfoster
Copy link

clintfoster commented Oct 31, 2018

Description

I just attempted to migrate from swagger-codegen to openapi-generator. It was mostly successful, except the behavior of allOf has changed. Previously the generated Java class would inherit from the first $ref and compose from the rest. With the new generator the Java class still extends the first $ref, as expected. But all the other $refs are ignored. (Their fields are no longer composed directly into the Java class.)

openapi-generator version

I am using the new Gradle plugin: openapi-generator-gradle-plugin:3.3.2 (much appreciated).

This previously worked with swagger-codegen-cli:3.0.2. In case you're wondering, since there is no official Gradle plugin I was using this org.hidetake.swagger.generator, which wraps the CLI as a Gradle plugin.

OpenAPI declaration file

See comments next to each $ref:

    Foo:
      allOf:
      - $ref: "#/components/schemas/FooBase"  # generated Java extended this class (still works)
      - $ref: "#/components/schemas/FooComposed1"  # all fields inlined (no longer works)
      - $ref: "#/components/schemas/FooComposed2"  # all fields inlined (no longer works)
      - properties:  # other props also inlined (still works)
          fooCount:
            type: integer

Note: FooBase has a discriminator. The composed models do not:

    FooBase:
      discriminator:
        propertyName: fooType
      required:
      - fooType
      properties:
        fooType:
          type: string
Command line used for generation
build.gradle excerpt
openApiGenerate {
    generatorName = 'java'
    configFile = 'open-api-cfg.json'
}
config file
{
  "modelPackage"     : "com.foo",
  "serializableModel": "true",
  "dateLibrary"      : "java8",
  "java8"            : "true"
}
Suggest a fix/enhancement

The Java generator should support single inheritance, plus an arbitrary number of composed models, as it did before. This allows a great deal of flexibility. For example, I have models representing "views" returned to clients consisting of a database record that extends a base model, plus fields composed from other models. The client need not know which fields came directly from the db record, and which are calculated on-the-fly and returned from other models.

@wing328
Copy link
Member

wing328 commented Nov 1, 2018

Ref: minimal spec to reproduce the issue: https://gist.github.com/clintfoster/d60b4da3f7b1249bf8c765dfb202bbc0

@wing328
Copy link
Member

wing328 commented Dec 10, 2018

#1360 has been merged into master. Please give it another try and let us know if it's still an issue.

Closing this issue for the time being.

@wing328 wing328 closed this as completed Dec 10, 2018
@clintfoster
Copy link
Author

Thank you! I will test with the next openapi-generator-gradle-plugin release, presumably 3.3.5.

@wing328
Copy link
Member

wing328 commented Dec 10, 2018

Next release is 4.0.0 (tentatively scheduled on Jan 30th)

@clintfoster
Copy link
Author

Confirmed fix in 4.0.0-beta2. Thank you!

One anomaly: The following console warning is still emitted, even though the additional inline schemas beyond the first are "composed" (not ignored), as expected:

More than one inline schema specified in allOf:. Only the first one is recognized. All others are ignored.

@wakedeer
Copy link

Confirmed fix in 4.0.0-beta2. Thank you!

One anomaly: The following console warning is still emitted, even though the additional inline schemas beyond the first are "composed" (not ignored), as expected:

More than one inline schema specified in allOf:. Only the first one is recognized. All others are ignored.

Is there a way to avoid this warning? I use version 4.2.2

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

No branches or pull requests

3 participants