swagger-api / swagger-api/swagger-codegen
[Java] Runtime problem parsing response object defined with additionalProperties
Nobody has claimed this yet.
- Dominant language
- Mustache
- Stars
- 17.8k
- Forks
- 6k
- PR merge metrics
- No merged PRs in 30d
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.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the generated Java ViewEntry class and the Java generation entry point invoked by generate -i ... -l java. Reproduce with the supplied schema excerpt if possible, then inspect how fixed properties and additionalProperties are parsed. Done means fixed-property getters and setters work while dynamic properties remain available through the HashMap interface.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- java
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100