Skip to content

Commit a13ff9f

Browse files
committed
Adding logic so as to ensure that the generated JsonTypeName follows the key from the oneOf pattern instead of the schema name
1 parent 0ff9625 commit a13ff9f

4 files changed

Lines changed: 109 additions & 1 deletion

File tree

modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.openapitools.codegen.meta.features.DocumentationFeature;
2727
import org.openapitools.codegen.meta.features.SecurityFeature;
2828
import org.openapitools.codegen.model.ModelMap;
29+
import org.openapitools.codegen.model.ModelsMap;
2930
import org.openapitools.codegen.model.OperationsMap;
3031

3132
import java.io.File;
@@ -327,11 +328,37 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert
327328
}
328329
}
329330

331+
@Override
332+
public ModelsMap postProcessModels(ModelsMap objs) {
333+
return super.postProcessModels(objs);
334+
}
335+
330336
@Override
331337
public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List<ModelMap> allModels) {
332338
objs = super.postProcessOperationsWithModels(objs, allModels);
333339
removeImport(objs, "java.util.List");
334340
return objs;
335341
}
336342

343+
@Override
344+
public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs) {
345+
Map<String, ModelsMap> result = super.postProcessAllModels(objs);
346+
for (ModelsMap modelsMap : result.values()) {
347+
for (ModelMap modelMap : modelsMap.getModels()) {
348+
CodegenModel model = modelMap.getModel();
349+
if (model.parentModel != null) {
350+
CodegenDiscriminator discriminator = model.parentModel.getDiscriminator();
351+
if (discriminator != null) {
352+
for (CodegenDiscriminator.MappedModel mappedModel : discriminator.getMappedModels()) {
353+
if (mappedModel.getModelName().equals(model.name)) {
354+
model.getVendorExtensions().put("x-discriminator-value", mappedModel.getMappingName());
355+
break;
356+
}
357+
}
358+
}
359+
}
360+
}
361+
}
362+
return result;
363+
}
337364
}

modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ import {{javaxPackage}}.xml.bind.annotation.XmlEnumValue;
3838
@Schema({{#title}}title="{{{.}}}", {{/title}}{{#description}}description="{{{.}}}"{{/description}}{{^description}}description=""{{/description}}){{/useSwaggerV3Annotations}}{{#useMicroProfileOpenAPIAnnotations}}
3939
@org.eclipse.microprofile.openapi.annotations.media.Schema({{#title}}title="{{{.}}}", {{/title}}{{#description}}description="{{{.}}}"{{/description}}{{^description}}description=""{{/description}}){{/useMicroProfileOpenAPIAnnotations}}
4040
{{#jackson}}
41-
@JsonTypeName("{{name}}")
41+
@JsonTypeName("{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}")
4242
{{#additionalProperties}}
4343
@JsonFormat(shape=JsonFormat.Shape.OBJECT)
4444
{{/additionalProperties}}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1237,6 +1237,38 @@ public void disableGenerateJsonCreator() throws Exception {
12371237
assertFileNotContains(files.get("RequiredProperties.java").toPath(), "@JsonCreator");
12381238
}
12391239

1240+
@Test
1241+
public void testDiscriminatorMappingUsedInJsonTypeName() throws Exception {
1242+
File output = Files.createTempDirectory("test").toFile().getCanonicalFile();
1243+
output.deleteOnExit();
1244+
1245+
OpenAPI openAPI = new OpenAPIParser()
1246+
.readLocation("src/test/resources/3_0/jaxrs/pestore.yaml", null, new ParseOptions()).getOpenAPI();
1247+
1248+
codegen.setOutputDir(output.getAbsolutePath());
1249+
1250+
ClientOptInput input = new ClientOptInput()
1251+
.openAPI(openAPI)
1252+
.config(codegen);
1253+
1254+
DefaultGenerator generator = new DefaultGenerator();
1255+
Map<String, File> files = generator.opts(input).generate().stream()
1256+
.collect(Collectors.toMap(File::getName, Function.identity()));
1257+
1258+
// Parent model uses its own name
1259+
JavaFileAssert.assertThat(files.get("PetRequest.java"))
1260+
.fileContains("@JsonTypeName(\"PetRequest\")");
1261+
1262+
// Child models must use the discriminator mapping value (e.g. "CAT"), not the class name (e.g. "CatRequest")
1263+
JavaFileAssert.assertThat(files.get("CatRequest.java"))
1264+
.fileContains("@JsonTypeName(\"CAT\")")
1265+
.fileDoesNotContain("@JsonTypeName(\"CatRequest\")");
1266+
1267+
JavaFileAssert.assertThat(files.get("DogRequest.java"))
1268+
.fileContains("@JsonTypeName(\"DOG\")")
1269+
.fileDoesNotContain("@JsonTypeName(\"DogRequest\")");
1270+
}
1271+
12401272
@Test
12411273
public void testGenerateJsonNullableListFieldsHelperMethodReferences_issue23251() throws Exception {
12421274
Map<String, Object> properties = new HashMap<>();

modules/openapi-generator/src/test/resources/3_0/jaxrs/petstore.yaml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,24 @@ paths:
157157
- petstore_auth:
158158
- 'read:pets'
159159
deprecated: true
160+
'/pet/request':
161+
post:
162+
operationId: createPetRequest
163+
security: []
164+
tags: [ pet ]
165+
requestBody:
166+
required: true
167+
content:
168+
application/json:
169+
schema:
170+
$ref: '#/components/schemas/PetRequest'
171+
responses:
172+
'201':
173+
description: Pet created successfully
174+
content:
175+
application/json:
176+
schema:
177+
$ref: '#/components/schemas/PetRequest'
160178
'/pet/{petId}':
161179
get:
162180
tags:
@@ -742,6 +760,37 @@ components:
742760
- sold
743761
xml:
744762
name: Pet
763+
PetRequest:
764+
type: object
765+
required:
766+
- petType
767+
properties:
768+
petType:
769+
type: string
770+
name:
771+
type: string
772+
oneOf:
773+
- $ref: '#/components/schemas/CatRequest'
774+
- $ref: '#/components/schemas/DogRequest'
775+
discriminator:
776+
propertyName: petType
777+
mapping:
778+
CAT: '#/components/schemas/CatRequest'
779+
DOG: '#/components/schemas/DogRequest'
780+
CatRequest:
781+
allOf:
782+
- $ref: '#/components/schemas/PetRequest'
783+
- type: object
784+
properties:
785+
indoor:
786+
type: boolean
787+
DogRequest:
788+
allOf:
789+
- $ref: '#/components/schemas/PetRequest'
790+
- type: object
791+
properties:
792+
bark:
793+
type: string
745794
ApiResponse:
746795
title: An uploaded response
747796
description: Describes the result of uploading an image resource

0 commit comments

Comments
 (0)