swagger-api/swagger-codegen

[Java] Runtime problem parsing response object defined with additionalProperties

Open

#4 970 ouverte le 7 mars 2017

Voir sur GitHub
 (2 commentaires) (0 réactions) (0 assignés)HTML (5 474 forks)batch import
Client: JavaIssue: Bughelp wanted

Métriques du dépôt

Stars
 (12 701 stars)
Métriques de merge PR
 (Aucune PR mergée en 30 j)

Description

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.

Guide contributeur