Open
Description
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
Labels
No labels