Open its-atique1987 opened 5 years ago
👍 Thanks for opening this issue! 🏷 I have applied any labels matching special text in your issue.
The team will review the labels and make any necessary changes.
Thanks for reporting this issue! I'll investigate this. 👀
(It's under investigation...)
SwaggerParseResult
has a duplicated schema definition. (ProblemDetails_2
)I've reported the issue in swagger-parser (https://github.com/swagger-api/swagger-parser/issues/1081)
waiting for a feedback from swagger-parser team.
Any update would be grateful. Thanks
UPDATE:
I've filed a PR to add a failing test case which reproduce the issue. https://github.com/swagger-api/swagger-parser/issues/1081#issuecomment-493655142
Hi
Any news about this issue?
This may be related to this issue. In my case duplicate models are generated even without cyclic references. The generator version I'm using is the Dockerized 4.2.3-SNAPSHOT.
I have the following layout:
.
├── catalog-api.yml
├── common-parameters.yml
├── common-responses.yml
├── common-schemas.yml
├── movies-api.yml
└── tvshows-api.yml
catalog-api.yml
is the 'root' spec that includes individual APIs e.g. movies-api.yml
. For movies-api.yml
the dependency graph is as follows:
catalog-api.yml
`-> movies-api.yml
|-> common-responses.yml
| `-> common-schemas.yml
|-> common-parameters.yml
`-> common-schemas.yml
You can see the reproducible example here: https://github.com/binaryunary/openapi-duplicate-models.
out/
contains openapi.json
that was generated with
docker run --rm -v ${PWD}:/local openapitools/openapi-generator-cli generate -i /local/catalog-api.yml -g openapi -o /local/out
You can see it contains duplicate models like AssetBase
and AssetBase_2
.
I was able to use a shared file in multiple specifications (which are merged into one later on) without duplicating a model. I think this is the same problem as what is posted here, except my situation has no cyclic deps in the files.
Edit: This is with 4.2.3 in https://github.com/moov-io/go-client
After playing around with external refs for a bit I discovered that swagger-parser will do some normalization on them, but it seems to happen lazily.
If you have a ref like
somefile.yml#/components/schemas/SomeSchema
then it will become
./somefile.yml#/components/schemas/SomeSchema
inside the parser after the first time this ref is resolved.
Internally SomeSchema
is cached when it is first read, when accessed the second time its source is different (somefile.yml != ./somefile.yml
) so a number is appended to its name to avoid conflicts.
Prefixing relative paths with ./
solves this problem, but it seems the parser still has problems normalizing the paths relative to the root spec file as having complex relative references (e.g. different levels, from different subdirectories) still break the parser.
Good news, the issue is resolved in the Swagger-Parser (https://github.com/swagger-api/swagger-parser/issues/1081#issuecomment-607169681, https://github.com/swagger-api/swagger-parser/issues/1292). We must only wait for the next release, to use it in the generator
Any updates?
I've been on 4.3.x without this issue. See how I did it above: https://github.com/OpenAPITools/openapi-generator/issues/2701#issuecomment-582152182
@adamdecaf I have same problem as a @binaryunary on latest master. I have 3 files If I have next dependency structure
-> main.yml
|-> other.yml
| ` -> main.yml
| `-> common.yml
`-> common.yml
Than I have two classes from main.yml file, that referenced in other.yml
But if I change it to next scheme, everything okey.
-> main.yml
|-> other.yml
`-> main.yml
`-> common.yml
will provide examples to reproduce latter
Bytheway. Is there way to eliminate cycle dependency for classes with discriminators located in different files?
What is referenced from main.yml
? Models? You could try a models.yml
. I use a common.yml
from a separate repo for global error types (i.e. error models).
We're using the latest versions of swagger-core, swagger-parser, and swagger-codegen:
io.swagger.codegen.v3:swagger-codegen-cli:3.0.23 io.swagger.codegen.v3:swagger-codegen:3.0.23 io.swagger.core.v3:swagger-annotations:2.1.5 io.swagger.core.v3:swagger-core:2.1.5 io.swagger.core.v3:swagger-models:2.1.5 io.swagger.parser.v3:swagger-parser-core:2.0.24 io.swagger.parser.v3:swagger-parser-v3:2.0.24 io.swagger.parser.v3:swagger-parser:2.0.24
But we still have this problem.
I'd happily preprocess our schema files if there's some way to munge them into a format that won't cause this.
What would the munged format need to look like?
When we fixed this locally in a fork, the fix looked like this:
if (existingModel != null) {
--
| LOGGER.debug("A model for " + existingModel + " already exists");
|
| /*
| * Added an additional check here - schema.get$ref() != null to ensure we generate
| * a single model file for a single model schema.
| */
| if(existingModel.get$ref() != null \|\| schema.get$ref() != null) {
| // use the new model
| existingModel = null;
| }else{
| //We add a number at the end of the definition name
| int i = 2;
| for (String name : schemas.keySet()) {
| if (name.equals(possiblyConflictingDefinitionName)) {
| tryName = possiblyConflictingDefinitionName + "_" + i;
| existingModel = schemas.get(tryName);
| i++;
| }
| }
| }
| }
That's not quite what the latest commit to ExternalRefProcessor in your github is doing.
This may be the work-around for this case. https://openapi-generator.tech/docs/usage/#type-mappings-and-import-mappings
I can see that the issue as been fixed in swagger-parser 2.0.19, and that the openapi-generation has updated the version used but this issue in present in both 5.0.1 and 5.1.0.
Strangely, downgrading to either 5.0.0 or 4.3.1 fixes the issue for me.
Any further updates of this?
It is happening with the newest (5.1.1) version as well. Downgrading to 5.0.0 or 4.3.2 didn't help.
Any updates of this?
@wing328 any news on this? Thanks
Having the same problem, is this going to be fixed?
There are multiple problems related to external refs. I provided reproducible cases in https://github.com/swagger-api/swagger-parser/issues/1518
Has been fixed in https://github.com/swagger-api/swagger-parser/pull/1566, no duplicate classes are generated anymore when using version 2.0.26.
Has it been tested with the reproducible cases in https://github.com/swagger-api/swagger-parser/issues/1518 ?
The history of this problem has been that a fix goes in for one symptom and that causes other symptoms to show up.
It's never been completely addressed.
any news?
Is there a workaround for this issue?
nnanda2016, see the workaround I posted above on Dec 7, 2020 (sorry about the weird formatting).
This seems to be a very serious issue and a complete show-stopper for the generator.
(just bumped into it and it seems there is no workaround either, unless you fork it and fix the error yourself)
Bumping this. Same issue in typescript generator as well.
Same problem here. Duplicated classes get generated once another yaml $ref another yaml's component. A bit sad not seeing any oficial workaround regarding this issue since it has been reported a while ago.
.
any workaround for this?
As a workaround, you may want to give https://github.com/apiture/api-ref-resolver a try to consolidate multiple OpenAPI spec files into a single one.
https://github.com/OpenAPITools/openapi-generator/issues/2701#issuecomment-582320928
Thank you for your analysis. I was able to resolve it. I prefixed each path in $ref
with ./
and duplicate classes are gone.
Duplicate model classes even referring internal $ref. Any solution yet?
Hi all, For example insted of: './common.yaml#/components/responses/E500' write './common.yaml/#/components/responses/E500'
After this modification I was able to remove duplicity ;)
What worked for us:
This seems to be an issue of generating duplicate classes due to the normalization of URLs and the resulting references being different. Would resolving the URLs into absolute paths not help in this case?
Flattening was the first thing I tried. It didn't help in our case.
Same issue here. This bug is annoying.
Workaround that worked for me:
I have "directory up" paths in my $ref in the OAS YAML like this:
$ref: ../models/Team.yaml
and $ref: ../models/User.yaml
When generating server code with the openapi-generator, making use of the inlineSchemaNameMappings
option fixed the issue for me:
--inline-schema-name-mappings Team_1=Team,User_1=User
, works with the Maven plugin as well (similar option there)
Thanks for the workaround! To anyone else who can't get it working at first: the trick is to find the correct internal name OpenAPI uses for your particular object that may not be the same as it appears in your programming language (in our case we had to use State_1
and not State1
as it appeared in Java.
You can see the actual names in the log output when running the generator, or as the contents of @JsonTypeName
in the generated source file (at least in the Java generator) - though we have found the logs to be more consistently reliable.
And I have to say I would appreciate at least a warning from OpenAPI generator when I'm telling it to remap a type that then doesn't actually exist :innocent:
Description
If Schemas are referenced in cyclic manner, the Models are generated twice. In below code,the Model
ProblemDetails
is generated twice asProblemDetails.java
ProblemDetails2.java
Is the correct way to reference? If Not why? and How to fix the above case?
openapi-generator version
openapi-generator-cli-4.0.0-beta3
OpenAPI declaration file content or url
java -jar openapi-generator-cli-4.0.0-beta3.jar generate -i openapi.yaml -g spring -o ./temp