-
-
Notifications
You must be signed in to change notification settings - Fork 6.4k
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
[BUG] [JAVA] openapi-generator-maven-plugin does not handle allOf composed of multiple objects #10010
Comments
any update on this? |
The bug is in the code-generator falling back to a raw Object class when both a schema ref and inline is used such as: ...
responses:
'200':
description: Some description
content:
application/json:
schema:
title: MyCustomClassNameResponse
allOf:
- type: object
properties:
data:
$ref: '#/components/schemas/Dog'
- $ref: '#/components/schemas/Pet'
... If you comment out the first inline object, you end up with just Pet, and if you comment the second reference you end up just with Dog. As work-around you can edit the spec and introduce your own return type and use a single ref there similar to: ...
responses:
'200':
description: Some description
content:
application/json:
schema:
$ref: '#/components/schemas/MyCustomClassNameResponse'
... Not don't claim you can't edit the spec, simply download it, modify it, check it in your source code and generate from it !!! |
@paulbors of course editing the spec is possible (and that's the solution we used now), but this is not very convenient if the openapi evolves : we have to manually change our version to match the new version. Besides, as you said editing the openapi is just a workaround. That's why I opened this issue : the fact that the generator does not generate right classes when providing a valid openapi spec (as in my example) is probably a bug and as so probably needs to be fixed. |
I was referring to your comments here: Right, so we know is not working with:
We know it works with:
So that's the real bug here. Now let's see which one of us (you or me) needs this to work first and puts out a Pull Request to this repo fixing it. The beauty of open source code... :) |
For me a "A single $ref" also doesnt work when using allOf :( However my case is a bit different:
I get a java class that only has "customerId" field |
Hello everyone, any progress on this. We have a lot of combined schema and need this functionality. If someone could point me to the specific code where the problem is, I could have a look to fix it. |
I guess this is the cause for other issues :
And I have the same issue with html2 generators also... |
Also ran into this bug :( |
I have the same issue also when generating plain models... |
In my case, initially I wrote:
After applying the change warning is gone. I'm using |
The warning is gone butt still it does not work (using java) |
Can this please be fixed!! |
It works in my case i.e.
Maybe providing a code snippets would be helpful for fixing it in this case. |
@skwasniak I am not sure if your second option is really correct. On https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/ you can find the following example:
What am I getting wrong here? |
@koalo I'm not saying this is accordingly to open api spec, I'm just stating a workaround that works for Anyhow it is a bug that needs attention, as probably it is widely used feature. P.S. My API spec is |
Upgrading from swagger v2 to swagger v3 we hit exactly this issue when generating java code. In swagger v2 codegen, allOf types would nicely be composed. In swagger v3 only the first type in the allOf would become part of the model... As the OpenAPITool community seems more active I now upgraded to OpenAPITools codegen. Although it still logs a nonsense warning about multiple types in allOf (please merge #7446 or other PR removing this warning in the correct way!): [main] WARN o.o.codegen.DefaultCodegen - allOf with multiple schemas defined. Using only the first one: XYZ as a matter of fact the generator 5.4.0 does correctly generate the complete composed java model! |
Using 5.4.0 with Java and agree with @consultantleon. The generated model is composed correctly from all schemas defined under the allOf, but this warning message is clearly wrong (allOf is supposed to be used with multiple schemas). |
I've upgraded to User:
allOf:
- $ref: '#/components/schemas/UserBase'
properties:
password:
type: string
format: password Generation of |
Also in case of |
@consultantleon @nikosmoum @skwasniak I am not sure how you got a complete composite object. I've tried with the example in my first post, using the latest versions at the time of the plugin ( In my case, the Java public class DefaultApi {
// ...
public A get() throws ApiException {
ApiResponse<A> localVarResp = getWithHttpInfo();
return localVarResp.getData();
}
// ...
} The Also, I've tried with Kotlin: mvn org.openapitools:openapi-generator-maven-plugin:5.4.0:generate \
-Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
-Dopenapi.generator.maven.plugin.generatorName=kotlin And got the same result (the method class DefaultApi(basePath: kotlin.String = defaultBasePath) : ApiClient(basePath) {
// ...
fun get() : A {
val localVarResponse = getWithHttpInfo()
return when (localVarResponse.responseType) {
// ...
}
}
// ...
} As @fastluca and others said, the bug is still present. By the way, these 3 OpenAPI specs parts (replace in my initial schema:
allOf:
- $ref: '#/components/schemas/A'
properties:
b:
type: integer and: schema:
allOf:
- $ref: '#/components/schemas/A'
- type: object
properties:
b:
type: integer and: schema:
allOf:
- $ref: '#/components/schemas/A'
type: "object"
properties:
b:
type: integer give exactly the same result in Java and Kotlin ( |
What I can observe with components:
schemas:
CustomQuery:
allOf:
- type: object
required:
- container
properties:
container:
type: string
default: '*'
- $ref: '#/components/schemas/CommonQuery' Then it will generate two classes, one The same happens if you use However, the Update: |
Any update? This is still a blocker in 6.1.0 |
Any update on this? I am using 6.2.0 and still getting this warning and compilation errors in models generated. |
Also experencing this issue with the C# dotnet Core generator. |
+1 |
+1 Same issue |
+1 same issue |
1 similar comment
+1 same issue |
+1 same issue |
5 similar comments
+1 same issue |
+1 same issue |
+1 same issue |
+1 same issue |
+1 same issue |
I tested with the spec provided in #10010 (comment) and cannot reproduce the issue and the output is what the users want as follows:
can someone please share another spec to more easily reproduce the issue? |
@wing328 thanks for your help, it looks like it works now since mvn org.openapitools:openapi-generator-maven-plugin:6.0.0:generate \
-Dopenapi.generator.maven.plugin.inputSpec=openapi.yaml \
-Dopenapi.generator.maven.plugin.generatorName=java creates a new class This public Get200Response get() throws ApiException {
ApiResponse<Get200Response> localVarResp = getWithHttpInfo();
return localVarResp.getData();
} So this should work for my case (I'm not able to test right now, but this should be ok): DefaultApi api = new DefaultApi();
Get200Response r = api.get();
System.out.println(r.getAttA());
System.out.println(r.getAttB()); |
The problem still exists in version 6.4.0. Example: |
@wing328 try to test it with this code yaml A:
type: object
properties:
attA:
type: string
B:
allOf:
- "$ref": "#/components/schemas/A"
type: object
properties:
attB:
type: integer
C:
allOf:
- "$ref": "#/components/schemas/B"
I would expect a C class with AttA and AttB but it only generates it with AttA I use the latest 6.4.0 |
thanks for sharing the spec to reproduce the issue. if anyone would like to sponsor the fix to make it a higher priority, please reply to let us know. |
Thanks @wing328 for your efforts. Great project by the way! I have sent a small bounty of 50$ |
I've found something that might interest you. By adding a vendor flag "x-parent": "abstract" you can make it work (at least in my case, spring-java and openapi-generator v6.4.0). The Schema I found under:
|
We have the same issue with the specification from coda.io https://coda.io/apis/v1/openapi.yaml |
@derkd I've filed #15039 to add a new openapi-generator normalizer rule to handle properties and allOf in the same level. Tested with your spec and the output compiles without issue. getUserCallLogsResponse200:
allOf:
- $ref: '#/components/schemas/baseResponse'
- example:
- additional_data:
- start: 0
- limit: 6
- more_items_in_collection: true
- data:
- - null
- - null
- properties:
- data:
- items:
- $ref: '#/components/schemas/responseCallLogObject'
- type: array
- additional_data:
- $ref: '#/components/schemas/fieldsResponse200_allOf_additional_data'
+ - $ref: '#/components/schemas/getUserCallLogsResponse200_allOf'
title: getUserCallLogsResponse200 Command:
|
@fbett thanks for the sponsorship 👍 |
PR merged. Please give it a try with the latest master via SNAPSHOT jar, docker images or build the project locally. |
@wing328 I am not sure, if it's actually fixed or if my plugin configuration is wrong (really lacking documentation and examples here) or if it does actually work and WARN log messages are not relevant. Specs: WSO2 APIM 4.0.0 - Admin V2
Log entries:
I need model only, as I plan to use Spring 6 declarative HTTP interface services with webclient proxy. AFAIK this library is not implemented in the generator. |
@norbjd:
vs
|
I have the same issue with a swagger.json generated by https://github.com/lukeautry/tsoa . Any updates? |
I have a similar issue using the following spec, with the Go language target: openapi: 3.0.3
info:
title: ''
version: ''
paths:
/path/request:
post:
parameters: []
requestBody:
content:
application/json:
schema:
type: object
properties:
items:
type: array
items:
allOf:
- $ref: '#/components/schemas/EntityLink'
properties:
__type:
enum:
- itemName
responses: {}
components:
schemas:
EntityType:
type: string
EntityLink:
type: object
properties:
__type:
$ref: '#/components/schemas/EntityType'
required:
- __type The resulting problem is that "__type" -> type PathRequestPostRequestItemsInner struct {
Type *string `json:"__type,omitempty"`
}
func NewPathRequestPostRequestItemsInner(type_ string) *PathRequestPostRequestItemsInner {
this := PathRequestPostRequestItemsInner{}
this.Type = type_ // <--- Note, this is trying to assign string to *string
return &this
} The manual fix is to transform the spec to inject a items:
allOf:
- $ref: '#/components/schemas/EntityLink'
properties:
__type:
enum:
- itemName
required:
- __type |
@isadounikau did you use the openapi-normalizer with the rule
|
I'm still experiencing the same issue with |
I also have issues with allOf not working. I know there is this workaround with openapi-normalizer with the rule REFACTOR_ALLOF_WITH_PROPERTIES_ONLY, but as far as i understand it does only work with a specification that isn't truly compatible with OpenApi 3.x - this is a great drawback because we want to provide a fully compatible specification to our customers... |
Bug Report Checklist
Description
Using
allOf
composed of multiple objects in a response does not generate a class combining these multiple objects. Instead it uses the first class defined in theallOf
section.openapi-generator version
Version
5.2.0
:I have also tested with
master
(5.2.1-SNAPSHOT
), commit fe9636e.OpenAPI declaration file content or url
Important part here is the
allOf
:Generation Details
Steps to reproduce
Shows a warning:
It generates classes A and B. But when calling
get()
, the value returned by the call isA
:I expected instead a composite object with
A
andB
properties (attA
andattB
), like this (result from https://editor.swagger.io/):Related issues/PRs
Suggest a fix
The text was updated successfully, but these errors were encountered: