Skip to content

[Java] Runtime problem parsing response object defined with additionalProperties #4970

Open
@ddelay

Description

@ddelay
Description

I'm seeing unexpected behavior when Swagger generated client code parses a response. The response object is defined to have a set of fixed properties. It also has a set of dynamic properties (not known until run time). I'm using additionalProperties to indicate the object has dynamic properties.

For example, consider the following response object:

{
  "@entryid": "xxx",
  "@noteid": "1139E",
  "fldText": "This is a test"
}

The first two properties (@entryid and @noteid) are a fixed part of the schema. The third property (fldText) is dynamic. I expect Swagger Codegen to generate getter methods for the first properties (which it does) and I expect to use the HashMap interface to read any dynamic properties.

The problem is the generated getter methods don't work. I have to read all properties via the HashMap. More details below in the Swagger declaration section.

Swagger-codegen version

Version 2.2.2. I don't know if this is a regression.

Swagger declaration file content or url

Here's an excerpt from my OpenAPI spec:

  viewEntry:
    type: object
    properties:
      '@entryid':
        description: |
          Position of the entry in the view or folder and the universal
          ID of any associated document.
        type: string
      '@noteid':
        description: |
          The note ID of the document associated with the entry, or an
          empty string if the entry is a category or total.
        type: string
    additionalProperties:
      type: object

When I generate a Java client I get a ViewEntry class. As expected it extends HashMap so it can hold dynamic properties:

public class ViewEntry extends HashMap<String, Object> {

Also as expected it includes getters and setters for the fixed properties:

  public String getEntryid() {
    return entryid;
  }

  public void setEntryid(String entryid) {
    this.entryid = entryid;
  }

However, when the Swagger client receives a response it doesn't parse the fixed properties as expected. In other words entry.getEntryid() always returns null. To read the value of @entryid I have to use the HashMap interface -- entry.get("@entryid").

If I remove additionalProperties from the API definition and generate the client again, the getters do work as expected. Of course, this isn't a suitable work-around because ViewEntry no longer extends HashMap and my dynamic properties are lost during response parsing.

Command line used for generation

generate -i /{specs}/data.yaml -l java -o /{clients}/data/java

Steps to reproduce

Since this is a runtime problem you need my API to reproduce. Unfortunately, the API isn't publicly available. Hopefully, you can diagnose the problem based on the information already provided.

Related issues

I couldn't find a similar issue.

Suggest a Fix

One way to fix the problem would be to change the generated getters to delegate to the HashMap. For example, instead of this:

  public String getEntryid() {
    return entryid;
  }

Generate this:

  public String getEntryid() {
    return get("@entryid");
  }

And of course make a similar change to the setters.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions