Skip to content

[JAVA] oneOf implementation: wrong discriminator values and discriminator field #197

Open
@jmzc

Description

@jmzc
Description

When JSON.java code is generated for an oneOf property, it is set wrong discriminator values,
and discriminator field is set empty

openapi-generator version

openapi-generator-cli-3.0.0 (SNAPSHOT 20180531.120113-109)

OpenAPI declaration file content or url
Person:
      type: object
      properties:
         genre:
            oneOf:
               - $ref: '#/components/schemas/Male'
               - $ref: '#/components/schemas/Female'
            discriminator:
               propertyName: genretype
               mapping:
                  M: '#/components/schemas/Male'
                  F: '#/components/schemas/Female'

Genre:
      type: object
      required:
        - genretype
      properties:
         genretype:
           type: string 
           enum:
            - M
            - F

Male:
     allOf:
      - $ref: '#/components/schemas/Genre'
      - type: object
    
Female:
     allOf:
      - $ref: '#/components/schemas/Genre'
      - type: object
Command line used for generation
java -jar openapi-generator-cli.jar generate \
-i openapi-3.0.yaml \
-l java \
-c java-config.json \
-o ./output

> cat java-config.json
{
  "modelPackage" : "com.test.ws.client.model",
  "apiPackage"   : "com.test.ws.client.api",
  "groupId" : "com.test.ws",
  "invokerPackage" : "com.test.ws.client",
  "artifactId"  : "testws-client",
  "artifact-version": "0.0.1-SNAPSHOT",
  "dateLibrary" : "threetenbp"
}
Steps to reproduce

After generation according step before , JSON.java class includes the next code

GsonFireBuilder fireBuilder = new GsonFireBuilder()
          .registerTypeSelector(Genre.class, new TypeSelector() {
            @Override
            public Class getClassForElement(JsonElement readElement) {
                Map classByDiscriminatorValue = new HashMap();
                classByDiscriminatorValue.put("Male".toUpperCase(), Male.class);
                classByDiscriminatorValue.put("Female".toUpperCase(),Female.class);
                classByDiscriminatorValue.put("Genre".toUpperCase(), Genre.class);
                return getClassByDiscriminator(
                                           classByDiscriminatorValue,
                                           getDiscriminatorValue(readElement, ""));
            }
          })
Related issues/PRs

Improve handling of oneOf #15

Suggest a fix/enhancement

I think that it should be:

  • to remove classByDiscriminatorValue.put("Genre".toUpperCase(), Genre.class);
  • to set discriminator values ( "M" and "F" , in this case )
  • to set a discriminator field ( "genretype" in this case )

So,

GsonFireBuilder fireBuilder = new GsonFireBuilder()
          .registerTypeSelector(Genre.class, new TypeSelector() {
            @Override
            public Class getClassForElement(JsonElement readElement) {
                Map classByDiscriminatorValue = new HashMap();
                classByDiscriminatorValue.put("M".toUpperCase(), Male.class);
                classByDiscriminatorValue.put("F".toUpperCase(),Female.class);
                return getClassByDiscriminator(
                                           classByDiscriminatorValue,
                                           getDiscriminatorValue(readElement, "genretype"));
            }
          })

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions