Openapi-generator: [NOT A BUG] [SHOULD BE CLOSED] Incomplete `JsonSubTypes` decorator support returns `null` by "subcasting"

Created on 22 Jan 2019  路  1Comment  路  Source: OpenAPITools/openapi-generator

Bug Report Checklist

  • [x] Have you provided a full/minimal spec to reproduce the issue?
  • [x] Have you validated the input using an OpenAPI validator (example)?
  • [x] What's the version of OpenAPI Generator used?
  • [x] Have you search for related issues/PRs?
  • [ ] What's the actual output vs expected output?
  • [ ] [Optional] Bounty to sponsor the fix (example)
Description

The source OpenAPI specification contains subtypes and enums.
I have possible unresolved cyclic dependency in generated models:
Both parent and child classes has the property (getter) which refers enum declared in the _same_ class.

The generated code cannot be compiled properly.


public class UnknownTOV extends TOVCreation {
/**
   * Gets or Sets unknown
   */
  public enum UnknownEnum {
    UNKNOWNTOV("UnknownTOV");

    private String value;

    UnknownEnum(String value) {
      this.value = value;
    }

    @JsonValue
    public String getValue() {
      return value;
    }

    @Override
    public String toString() {
      return String.valueOf(value);
    }

    @JsonCreator
    public static UnknownEnum fromValue(String text) {
      for (UnknownEnum b : UnknownEnum.values()) {
        if (String.valueOf(b.value).equals(text)) {
          return b;
        }
      }
      throw new IllegalArgumentException("Unexpected value '" + text + "'");
    }
  }

  @JsonProperty("unknown")
  private UnknownEnum unknown;

  public UnknownTOV unknown(UnknownEnum unknown) {
    this.unknown = unknown;
    return this;
  }

   /**
   * Get unknown
   * @return unknown
  **/
  @ApiModelProperty(required = true, value = "")
  public UnknownEnum getUnknown() {
    return unknown;
  }

  public void setUnknown(UnknownEnum unknown) {
    this.unknown = unknown;
  }
....
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true)
@JsonSubTypes({
 ....
  @JsonSubTypes.Type(value = UnknownTOV.class, name = "UnknownTOV"),
....
})

public class TOVCreation {
  /**
   * Gets or Sets unknown
   */
  public enum UnknownEnum {
    UNKNOWNTOV("UnknownTOV");

    private String value;

    UnknownEnum(String value) {
      this.value = value;
    }

    @JsonValue
    public String getValue() {
      return value;
    }

    @Override
    public String toString() {
      return String.valueOf(value);
    }

    @JsonCreator
    public static UnknownEnum fromValue(String text) {
      for (UnknownEnum b : UnknownEnum.values()) {
        if (String.valueOf(b.value).equals(text)) {
          return b;
        }
      }
      throw new IllegalArgumentException("Unexpected value '" + text + "'");
    }
  }


@JsonProperty("unknown")
private UnknownEnum unknown;

public TOVCreation unknown(UnknownEnum unknown) {
    this.unknown = unknown;
    return this;
  }

   /**
   * Get unknown
   * @return unknown
  **/
  @ApiModelProperty(value = "")
// Incompatible types.
// Required:
// com.xxx.mmmm.persistent.UnknownTOV.UnknownEnum
// Found:
// com.xxx.mmmm.persistent.TOVCreation.UnknownEnum
  public UnknownTOV.UnknownEnum getUnknown() {
    return unknown;
  }

  public void setUnknown(UnknownEnum unknown) {
    this.unknown = unknown;
  }

I am unable to fix this issue to make code compilable.

As I mentioned @Override cannot help in this case.

The IntelliJ IDEA red bulb 馃挕 fix helper causes infinite loop.

The only way I found is comment out problem code.

How can I resolve issue in right way

openapi-generator version

4.0.0-SNAPSHOT

OpenAPI declaration file content or url
TOVCreation:
    type: object
    discriminator: type
    properties:
       unknown:
          type: string
           enum:
             - UnknownTOV

UnknownTOV:
    allOf:
      - $ref: '#/definitions/TOVCreation'
      - type: object
        properties:
          unknown:
            type: string
            enum:
              - UnknownTOV
        required:
          - unknown
Bug

>All comments

The bug is still blocker for me

java @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", visible = true) @JsonSubTypes({ @JsonSubTypes.Type(value = EnumerationUDF.class, name = "EnumerationUDF"), @JsonSubTypes.Type(value = StringUDF.class, name = "StringUDF"), @JsonSubTypes.Type(value = BooleanUDF.class, name = "BooleanUDF"), })

without @JsonTypeInfo and @JsonSubTypes it can generate

```java
// In projectProjectKeyUdfsGet List should be changed to List
// all list items in this case are not null, has proper class type and all subtype specific properties are filled
List projectUdfs = api.projectProjectKeyUdfsGet(projectKey)
````

```java
// In projectProjectKeyUdfsGet originally generated List
// Original buggy version with the generated @ JsonTypeInfo and @ JsonSubTypes annotations:
// all list items in this case are null
List projectUdfs = api.projectProjectKeyUdfsGet(projectKey)
````

Was this page helpful?
0 / 5 - 0 ratings