OpenAPITools / OpenAPITools/openapi-generator

[BUG][JAVA] NullPointerException in getEnumValueForProperty when generating model with oneOf and discriminator

Open
#22,177 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Issue: Bug
Dominant language
Java
Stars
26.8k
Forks
7.7k
PR merge metrics
PR metrics pending

Description

Bug Report Checklist

openapi.yaml

[x] Have you provided a full/minimal spec to reproduce the issue?

[x] Have you validated the input using an OpenAPI validator?

[x] Have you tested with the latest master to confirm the issue still exists?

[x] Have you searched for related issues/PRs?

[x] What's the actual output vs expected output? (Actual: Crash. Expected: Generated code)

[ ] [Optional] Sponsorship to speed up the bug fix or feature request (example)

When generating a Java client, the generator fails with a NullPointerException while processing a specific model named 'Node'. This model uses a oneOf list combined with a discriminator (see spec below).

The error seems to originate in DefaultCodegen.getEnumValueForProperty (line ~3221), which is called by setEnumDiscriminatorDefaultValue. The root cause is a NullPointerException because var.allowableValues is null when the code attempts to call .get(Object) on it. This blocks the entire code generation process.

Stack Trace:
[main] WARN  o.o.codegen.DefaultCodegen - OpenAPI 3.1 support is still in beta. To report an issue related to 3.1 spec, please kindly open an issue in the Github repo: https://github.com/openAPITools/openapi-generator.
[main] INFO  o.o.codegen.DefaultGenerator - Model AnnotationsTrait not generated since it's a free-form object
Exception in thread "main" java.lang.RuntimeException: Could not process model 'Node'.Please make sure that your schema is correct!
        at org.openapitools.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:518)
        at org.openapitools.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:443)
        at org.openapitools.codegen.DefaultGenerator.generate(DefaultGenerator.java:1291)
        at org.openapitools.codegen.cmd.Generate.execute(Generate.java:535)
        at org.openapitools.codegen.cmd.OpenApiGeneratorCommand.run(OpenApiGeneratorCommand.java:32)
        at org.openapitools.codegen.OpenAPIGenerator.main(OpenAPIGenerator.java:66)
Caused by: java.lang.NullPointerException: Cannot invoke "java.util.Map.get(Object)" because "var.allowableValues" is null
        at org.openapitools.codegen.DefaultCodegen.getEnumValueForProperty(DefaultCodegen.java:3221)
        at org.openapitools.codegen.DefaultCodegen.lambda$setEnumDiscriminatorDefaultValue$17(DefaultCodegen.java:3193)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)
        at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1708)
        at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762)
        at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276)
        at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:1024)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at org.openapitools.codegen.DefaultCodegen.setEnumDiscriminatorDefaultValue(DefaultCodegen.java:3193)
        at org.openapitools.codegen.languages.AbstractJavaCodegen.fromModel(AbstractJavaCodegen.java:1842)
        at org.openapitools.codegen.languages.JavaClientCodegen.fromModel(JavaClientCodegen.java:1070)
        at org.openapitools.codegen.DefaultGenerator.processModels(DefaultGenerator.java:1753)
        at org.openapitools.codegen.DefaultGenerator.generateModels(DefaultGenerator.java:513)
        ... 5 more
openapi-generator version

7.16.0 (and also confirmed on the latest master branch).

OpenAPI declaration file content or url

The error occurs when processing the following Node definition (from openapi.yaml, starting at line 3543):

YAML


    Node:
      oneOf:
        - $ref: "#/components/schemas/BooleanOperationNode"
        - $ref: "#/components/schemas/ComponentNode"
        - $ref: "#/components/schemas/ComponentSetNode"
        - $ref: "#/components/schemas/ConnectorNode"
        - $ref: "#/components/schemas/EllipseNode"
        - $ref: "#/components/schemas/EmbedNode"
        - $ref: "#/components/schemas/FrameNode"
        - $ref: "#/components/schemas/GroupNode"
        - $ref: "#/components/schemas/InstanceNode"
        - $ref: "#/components/schemas/LineNode"
        - $ref: "#/components/schemas/LinkUnfurlNode"
        - $ref: "#/components/schemas/RectangleNode"
        - $ref: "#/components/schemas/RegularPolygonNode"
        - $ref: "#/components/schemas/SectionNode"
        - $ref: "#/components/schemas/ShapeWithTextNode"
        - $ref: "#/components/schemas/SliceNode"
        - $ref: "#/components/schemas/StarNode"
        - $ref: "#/components/schemas/StickyNode"
        - $ref: "#/components/schemas/TableNode"
        - $ref: "#/components/schemas/TableCellNode"
        - $ref: "#/components/schemas/TextNode"
        - $ref: "#/components/schemas/TextPathNode"
        - $ref: "#/components/schemas/TransformGroupNode"
        - $ref: "#/components/schemas/VectorNode"
        - $ref: "#/components/schemas/WashiTapeNode"
        - $ref: "#/components/schemas/WidgetNode"
        - $ref: "#/components/schemas/DocumentNode"
        - $ref: "#/components/schemas/CanvasNode"
      discriminator:
        propertyName: type
        mapping:
          BOOLEAN_OPERATION: "#/components/schemas/BooleanOperationNode"
          COMPONENT: "#/components/schemas/ComponentNode"
          COMPONENT_SET: "#/components/schemas/ComponentSetNode"
          CONNECTOR: "#/components/schemas/ConnectorNode"
          ELLIPSE: "#/components/schemas/EllipseNode"
          EMBED: "#/components/schemas/EmbedNode"
          FRAME: "#/components/schemas/FrameNode"
          GROUP: "#/components/schemas/GroupNode"
          INSTANCE: "#/components/schemas/InstanceNode"
          LINE: "#/components/schemas/LineNode"
          LINK_UNFURL: "#/components/schemas/LinkUnfurlNode"
          RECTANGLE: "#/components/schemas/RectangleNode"
          REGULAR_POLYGON: "#/components/schemas/RegularPolygonNode"
          SECTION: "#/components/schemas/SectionNode"
          SHAPE_WITH_TEXT: "#/components/schemas/ShapeWithTextNode"
          SLICE: "#/components/schemas/SliceNode"
          STAR: "#/components/schemas/StarNode"
          STICKY: "#/components/schemas/StickyNode"
          TABLE: "#/components/schemas/TableNode"
          TABLE_CELL: "#/components/schemas/TableCellNode"
          TEXT: "#/components/schemas/TextNode"
          TEXT_PATH: "#/components/schemas/TextPathNode"
          TRANSFORM_GROUP: "#/components/schemas/TransformGroupNode"
          VECTOR: "#/components/schemas/VectorNode"
          WASHI_TAPE: "#/components/schemas/WashiTapeNode"
          WIDGET: "#/components/schemas/WidgetNode"
          DOCUMENT: "#/components/schemas/DocumentNode"
          CANVAS: "#/components/schemas/CanvasNode"
Generation Details

The java generator is being used (likely with default libraries).

Command to reproduce (using CLI Node.js)

openapi-generator-cli generate -i openapi.yaml -g java -o ./types/java

Steps to reproduce
  1. Use a valid OpenAPI 3.1 spec (e.g., openapi.yaml) that contains the Node schema provided above.
  2. Run the java generator against this spec using either the Node.js CLI or the Java JAR
  3. The generation process will crash when attempting to process the Node model.
  4. Observe the RuntimeException caused by the NullPointerException in the console output.
Related issues/PRs

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure with the provided openapi.yaml and the openapi-generator-cli generate -i openapi.yaml -g java -o ./types/java command. Start in DefaultCodegen.getEnumValueForProperty and follow its call from setEnumDiscriminatorDefaultValue, using the Node oneOf/discriminator schema and stack trace as the scope. Done means the Java generator processes the Node model without the reported NullPointerException and produces generated code.

Written by the indexing model from the issue text.

Assessment

Tech stack
java, openapi
Domain
api, tooling
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.