-
-
Notifications
You must be signed in to change notification settings - Fork 6.5k
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] StackOverflowError in DefaultCodegen.addProperties when a schemas with same name are referenced directly and indirectly #4650
Comments
👍 Thanks for opening this issue! The team will review the labels and make any necessary changes. |
I am also running into this issue. Any workarounds? |
I added 3 suptypes extending this abstract class and I got the error below: Exception in thread "main" java.lang.StackOverflowError |
I have faced the same issue now. Here is a minimal project where the issue can be reproduced when running I would propose that addProperties should get an additional parameter with a set of already visited schemas. If properties for a known schema should be added (again), return. |
What a coincidence. The today's SNAPSHOT is failing for this command
I'll wait for 20220219 and re-check |
Thanks @kthoms , your fork works |
…hemas The generator ran into a loop when a composite schema recursively added itself. This change provides a reproducing example and fixes the issue by extending DefaultCodegen#addProperties() by an additional circuit breaker parameter. When additionalProperties() is called with a schema instance for which the properties have already been added, the method directly returns and does not run into the loop.
The generator ran into a loop when a composite schema recursively added itself. This change provides a reproducing example and fixes the issue by extending DefaultCodegen#addProperties() by an additional circuit breaker parameter. When additionalProperties() is called with a schema instance for which the properties have already been added, the method directly returns and does not run into the loop.
Hi I still have the same error with version 6.0.0-beta (does not work neither for spring server nor for resttemplate) My spec is: openapi: 3.0.1
info:
title: My Service
description: My Description
version: 1.1.0
tags:
- name: Schema
description: Schema
paths:
/my-path:
get:
summary: Get entity schema
description: Get the schema data of an entity
operationId: MyOperation
tags:
- Schema
responses:
'200':
description: A paged array of entity schemas
content:
application/json:
schema:
type: object
properties:
data:
$ref: "#/components/schemas/EntitySchema"
components:
schemas:
EntitySchemaAttr:
type: object
description: the attributes of the entity
additionalProperties:
type: object
properties:
name:
type: string
type:
type: string
attrs:
type: object
description: nested attributes
additionalProperties:
allOf:
- $ref: "#/components/schemas/EntitySchemaAttr"
EntitySchema:
properties:
domain:
type: string
entity:
type: string
schemaUri:
type: string
attrs:
$ref: "#/components/schemas/EntitySchemaAttr"
StacktraceException in thread "main" java.lang.StackOverflowError
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:789)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:178)
at io.swagger.v3.core.jackson.SchemaSerializer.serialize(SchemaSerializer.java:35)
at io.swagger.v3.core.jackson.SchemaSerializer.serialize(SchemaSerializer.java:13)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480)
at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:319)
at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1518)
at com.fasterxml.jackson.databind.ObjectWriter._writeValueAndClose(ObjectWriter.java:1219)
at com.fasterxml.jackson.databind.ObjectWriter.writeValueAsString(ObjectWriter.java:1086)
at io.swagger.v3.core.util.Json.pretty(Json.java:24)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3463)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.addVars(DefaultCodegen.java:5250)
at org.openapitools.codegen.DefaultCodegen.addVarsRequiredVarsAdditionalProps(DefaultCodegen.java:6873)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3360)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3358)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3606)
at org.openapitools.codegen.DefaultCodegen.getComposedProperties(DefaultCodegen.java:7384)
at org.openapitools.codegen.DefaultCodegen.getComposedSchemas(DefaultCodegen.java:7371)
at org.openapitools.codegen.DefaultCodegen.fromProperty(DefaultCodegen.java:3552)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForMap(DefaultCodegen.java:3337)
at org.openapitools.codegen.DefaultCodegen.updatePropertyForObject(DefaultCodegen.java:3351) With version 5.3.0 Stackoverflow does not occur but from 5.3.1 onwards it does. @wing328 @kthoms, I think we should reopen this issue and fix the problem. Thank you |
I have recently build from master and that version fixed my issue at least. Might be that your example uncovers a new situation. I don't have time to look at it ATM. |
Bug Report Checklist
java.lang.StackOverflowError, expected Sring generated project
Description
When trying to generate spring project from a complex .yaml file setup a java.lang.StackOverflowError is thrown.
The setup is the following:
Base.yaml contains a definition of Test
Blue.yaml contains a definition of Test which inherits with Allof from Base.yaml->Test
Green.yaml also contains a definition of Test which inherits with Allof from Base.yaml->Test and also it has a reference to Blue.yaml->Test
When generation is started for Green.yaml , DefaultCodegen.addProperties causes stack overflow.
Generator first loads the Base.yaml->Test reference in its cache.
The problem happens when the generator starts processing the Blue.yaml->Test reference in Green.yaml.
It loads the Blue.yaml->Test but wrongly overrides the Base.yaml->Test in its cache.
Blue.yaml->Test is inheriting from Base.yaml->Test but now after the override Blue.yaml->Test inherits from itself and becomes corrupt!!!!!!!!!.
After this when DefaultCodegen.addProperties starts its work it goes into endless recursion trying to process the corrupted self referencing Blue.yaml->Test .
See the stack trace below:
[main] INFO o.o.codegen.DefaultGenerator - OpenAPI Generator: spring (server)
[main] INFO o.o.codegen.DefaultGenerator - Generator 'spring' is considered stable.
[main] INFO o.o.codegen.languages.SpringCodegen - ----------------------------------
[main] INFO o.o.c.languages.AbstractJavaCodegen - Environment variable JAVA_POST_PROCESS_FILE not defined so the Java code may not be properly formatted. To define it, try 'export JAVA_POST_PROCESS_FILE="/usr/local/bin/clang-format -i"' (Linux/Mac)
[main] INFO o.o.c.languages.AbstractJavaCodegen - NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to
true
(--enable-post-process-file for CLI).[main] INFO o.o.c.languages.AbstractJavaCodegen - Processing operation test
[main] INFO o.o.c.languages.AbstractJavaCodegen - Processing operation inbox_storeTaskResponse
Exception in thread "main" java.lang.StackOverflowError
at org.apache.commons.lang3.StringUtils.isNotBlank(StringUtils.java:327)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2020)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2002)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2022)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2002)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2022)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2002)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2022)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2002)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2022)
at org.openapitools.codegen.DefaultCodegen.addProperties(DefaultCodegen.java:2002)
openapi-generator version
4.2.1
OpenAPI declaration file content or url
Command line used for generation
openapi-generator generate -i task-test.yaml -g spring -o test
Steps to reproduce
Related issues/PRs
Suggest a fix
The problem seem to be that when loading a second ref .yaml file which contains schemas with the same name as a component from the other first ref.yaml file. The second component overrides the first component.
The text was updated successfully, but these errors were encountered: