Skip to content

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

@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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions