Skip to content
GitLab
Projects Groups Snippets
  • /
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
  • O openapi-generator
  • Project information
    • Project information
    • Activity
    • Labels
    • Members
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 3,476
    • Issues 3,476
    • List
    • Boards
    • Service Desk
    • Milestones
  • Merge requests 402
    • Merge requests 402
  • CI/CD
    • CI/CD
    • Pipelines
    • Jobs
    • Schedules
  • Deployments
    • Deployments
    • Environments
    • Releases
  • Packages and registries
    • Packages and registries
    • Package Registry
    • Infrastructure Registry
  • Monitor
    • Monitor
    • Incidents
  • Analytics
    • Analytics
    • Value stream
    • CI/CD
    • Repository
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • OpenAPI Tools
  • openapi-generator
  • Issues
  • #1113
Closed
Open
Issue created Sep 25, 2018 by Administrator@rootContributor

[JAVA] Cannot use single discriminator field for two-level inheritance

Created by: wheezil

Description

I would like to use "inheritance" via allOf in the spec, and I'd like more than one level for my request schemas. This will allow me to have models all share a common base, but then further split them into categories. It seems that openapi-generator supports this, and validates such a spec, but the Java codegen does not produce valid code if the same discriminator field is used at both levels.

openapi-generator version

3.3.0-SNAPSHOT

OpenAPI declaration file content or url
{
   "openapi": "3.0.0",
   "info": {
      "description": "blah",
      "version": "1.0.0",
      "title": "blah"
   },
   "paths": {
      "/test1": {
         "post": {
            "tags": [
              "test"
            ],
            "operationId": "testOp1",
            "responses": {
               "200": {
                  "description": "Success",
                  "content": {
                     "application/json": {
                        "schema": {
                           "oneOf": [
                              { "$ref": "#/components/schemas/Response1" },
                              { "$ref": "#/components/schemas/Response2" }
                           ]
                        }
                     }
                  }
               },
               "405": {
                  "description": "Invalid input"
               }
            },
            "requestBody": {
               "content": {
                  "application/json": {
                     "schema": {
                        "$ref": "#/components/schemas/Request"
                     }
                  }
               }
            }
         }
      }
   },
   "components": {
      "schemas": {
         "Base": {
            "properties": {
               "type":{
                  "type":"string"
               }
            },
            "discriminator":{
               "propertyName": "type"
            }
         },
         "Request": {
            "allOf":[
               { "$ref": "#/components/schemas/Base" },
               {
                  "type":"object",
                  "properties": {
                     "resource": {
                        "type": "string"
                     }
                  }
               }
            ]
         },
         "ResponseBase": {
            "allOf":[
               { "$ref": "#/components/schemas/Base" }
            ],
            "discriminator":{
               "propertyName": "type"
            }
         },
         "Response1": {
            "allOf":[
               { "$ref": "#/components/schemas/ResponseBase" },
               {
                  "type":"object",
                  "properties": {
                     "status": {
                        "type": "string"
                     }
                  }
               }
            ]
         },
         "Response2": {
            "allOf":[
               { "$ref": "#/components/schemas/ResponseBase" },
               {
                  "type":"object",
                  "properties": {
                     "name": {
                        "type": "string"
                     }
                  }
               }
            ]
         }
      }
   }
}
Command line used for generation

java -jar OPENAPIJAR.jar generate -o genjava -g java -i two_level_inheritance.json -c rpdmcpp.config

Steps to reproduce

Run above command and load generated maven project

Related issues/PRs

#1068 (CSharp generator)

Suggest a fix/enhancement

The problem is that the discriminator field is private in the base class, yet the intermediate class attempts to set it in the constructor:

  public ResponseBase() {
    this.type = this.getClass().getSimpleName();
  }

There is no reason to when there is a parent using the same discriminator, because the parent (which has access to the field) will do it anyway. I believe this happens around line 81 of pojo.mustache:

  {{^parcelableModel}}
  {{#gson}}
  {{#discriminator}}
  public {{classname}}() {
    this.{{{discriminatorName}}} = this.getClass().getSimpleName();
  }
  {{/discriminator}}
  {{/gson}}
  {{/parcelableModel}}

It may be impossible to condition mustache template on "if parent has the same discriminator field". However the setter is public. Can we know what is the setter for the discriminator? Can the fields be made protected instead of private?

Assignee
Assign to
Time tracking