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

[BUG] StackOverflowError in DefaultCodegen.addProperties when a schemas with same name are referenced directly and indirectly #4650

Closed
3 tasks
ivo500 opened this issue Nov 29, 2019 · 8 comments · Fixed by #11620

Comments

@ivo500
Copy link

ivo500 commented Nov 29, 2019

Bug Report Checklist

  • [Y ] Have you provided a full/minimal spec to reproduce the issue?
  • [ Y] Have you validated the input using an OpenAPI validator (example)?
  • What's the version of OpenAPI Generator used? 4.2.1
  • [Y ] Have you search for related issues/PRs?
  • What's the actual output vs expected output?
    java.lang.StackOverflowError, expected Sring generated project
  • [Optional] Bounty to sponsor the fix (example)
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.

@auto-labeler
Copy link

auto-labeler bot commented Nov 29, 2019

👍 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.

@ivo500 ivo500 changed the title [BUG] Description [BUG] StackOverflowError in DefaultCodegen.addProperties when a schemas with same name are is referenced directly and indirectly Nov 29, 2019
@ivo500 ivo500 changed the title [BUG] StackOverflowError in DefaultCodegen.addProperties when a schemas with same name are is referenced directly and indirectly [BUG] StackOverflowError in DefaultCodegen.addProperties when a schemas with same name are referenced directly and indirectly Nov 29, 2019
@connorworley
Copy link

I am also running into this issue. Any workarounds?

@phirzel
Copy link

phirzel commented Apr 10, 2021

I added 3 suptypes extending this abstract class and I got the error below:
@Schema(name = "Place", description = "..",
type = "object",
title = "Abstract Place",
subTypes = {StopPlace.class, AddressPlace.class, PoiPlace.class})
public abstract class PlaceV3 implements Place {..}
@Schema(name = "StopPlace", description = "..")
@builder
@value
@tostring
public class StopPlace extends PlaceV3 {..}
..

Exception in thread "main" java.lang.StackOverflowError
at java.base/java.lang.String.lastIndexOf(String.java:1808)
at java.base/java.lang.String.lastIndexOf(String.java:1772)
at java.base/java.lang.String.lastIndexOf(String.java:1751)
at org.openapitools.codegen.utils.ModelUtils.getSimpleRef(ModelUtils.java:385)
at org.openapitools.codegen.utils.ModelUtils.getReferencedSchema(ModelUtils.java:832)
at org.openapitools.codegen.DefaultCodegen.recursiveGetDiscriminator(DefaultCodegen.java:2735)
at org.openapitools.codegen.DefaultCodegen.recursiveGetDiscriminator(DefaultCodegen.java:2750)

@kthoms
Copy link
Contributor

kthoms commented Feb 16, 2022

I have faced the same issue now. Here is a minimal project where the issue can be reproduced when running mvn install: https://github.com/kthoms/issue-reproduction/tree/OpenAPITools/openapi-generator/recursive_properties

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.

@basinilya
Copy link

What a coincidence. The today's SNAPSHOT is failing for this command

openapi-generator-cli.bat generate -i https://datahub-spec.s3.eu-central-1.amazonaws.com/transform.yaml -g openapi

I'll wait for 20220219 and re-check

@basinilya
Copy link

Thanks @kthoms , your fork works

kthoms pushed a commit to kthoms/openapi-generator that referenced this issue Feb 23, 2022
…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.
wing328 pushed a commit that referenced this issue Mar 1, 2022
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.
@jorgerod
Copy link
Contributor

jorgerod commented Apr 5, 2022

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"
Stacktrace
Exception 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

@kthoms
Copy link
Contributor

kthoms commented Apr 5, 2022

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.

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

Successfully merging a pull request may close this issue.

6 participants