From 6839b7fd80930d632f91fc264f9b8412b976ab2d Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 22:21:34 +0000 Subject: [PATCH 1/6] fixed discriminator --- .../languages/JavaJAXRSSpecServerCodegen.java | 28 ++++++ .../resources/JavaJaxRS/spec/pojo.mustache | 2 +- .../jaxrs/JavaJAXRSSpecServerCodegenTest.java | 32 ++++++ .../3_0/jaxrs/pestore-with-discriminator.yaml | 99 +++++++++++++++++++ 4 files changed, 160 insertions(+), 1 deletion(-) create mode 100644 modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index 3a9d43e8cb27..3eb5c422b6f9 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -26,6 +26,7 @@ import org.openapitools.codegen.meta.features.DocumentationFeature; import org.openapitools.codegen.meta.features.SecurityFeature; import org.openapitools.codegen.model.ModelMap; +import org.openapitools.codegen.model.ModelsMap; import org.openapitools.codegen.model.OperationsMap; import java.io.File; @@ -327,6 +328,33 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert } } + @Override + public Map postProcessAllModels(Map objs) { + Map result = super.postProcessAllModels(objs); + for (ModelsMap modelsMap : result.values()) { + for (ModelMap mo : modelsMap.getModels()) { + CodegenModel cm = mo.getModel(); + if (cm.parentModel != null) { + CodegenDiscriminator discriminator = cm.parentModel.getDiscriminator(); + if (discriminator != null) { + for (CodegenDiscriminator.MappedModel mappedModel : discriminator.getMappedModels()) { + if (mappedModel.getModelName().equals(cm.name)) { + cm.getVendorExtensions().put("x-discriminator-value", mappedModel.getMappingName()); + break; + } + } + } + } + } + } + return result; + } + + @Override + public ModelsMap postProcessModels(ModelsMap objs) { + return super.postProcessModels(objs); + } + @Override public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List allModels) { objs = super.postProcessOperationsWithModels(objs, allModels); diff --git a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache index 83970c86ca74..61c0e66e4230 100644 --- a/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache +++ b/modules/openapi-generator/src/main/resources/JavaJaxRS/spec/pojo.mustache @@ -38,7 +38,7 @@ import {{javaxPackage}}.xml.bind.annotation.XmlEnumValue; @Schema({{#title}}title="{{{.}}}", {{/title}}{{#description}}description="{{{.}}}"{{/description}}{{^description}}description=""{{/description}}){{/useSwaggerV3Annotations}}{{#useMicroProfileOpenAPIAnnotations}} @org.eclipse.microprofile.openapi.annotations.media.Schema({{#title}}title="{{{.}}}", {{/title}}{{#description}}description="{{{.}}}"{{/description}}{{^description}}description=""{{/description}}){{/useMicroProfileOpenAPIAnnotations}} {{#jackson}} -@JsonTypeName("{{name}}") +@JsonTypeName("{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}") {{#additionalProperties}} @JsonFormat(shape=JsonFormat.Shape.OBJECT) {{/additionalProperties}} diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java index 2e9e2e2153d2..fa318952bc81 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java @@ -1237,4 +1237,36 @@ public void disableGenerateJsonCreator() throws Exception { assertFileNotContains(files.get("RequiredProperties.java").toPath(), "@JsonCreator"); } + @Test + public void testDiscriminatorMappingUsedInJsonTypeName() throws Exception { + File output = Files.createTempDirectory("test").toFile().getCanonicalFile(); + output.deleteOnExit(); + + OpenAPI openAPI = new OpenAPIParser() + .readLocation("src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml", null, new ParseOptions()).getOpenAPI(); + + codegen.setOutputDir(output.getAbsolutePath()); + + ClientOptInput input = new ClientOptInput() + .openAPI(openAPI) + .config(codegen); + + DefaultGenerator generator = new DefaultGenerator(); + Map files = generator.opts(input).generate().stream() + .collect(Collectors.toMap(File::getName, Function.identity())); + + // Parent model uses its own name + JavaFileAssert.assertThat(files.get("PetRequest.java")) + .fileContains("@JsonTypeName(\"PetRequest\")"); + + // Child models must use the discriminator mapping value (e.g. "CAT"), not the class name (e.g. "CatRequest") + JavaFileAssert.assertThat(files.get("CatRequest.java")) + .fileContains("@JsonTypeName(\"CAT\")") + .fileDoesNotContain("@JsonTypeName(\"CatRequest\")"); + + JavaFileAssert.assertThat(files.get("DogRequest.java")) + .fileContains("@JsonTypeName(\"DOG\")") + .fileDoesNotContain("@JsonTypeName(\"DogRequest\")"); + } + } diff --git a/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml b/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml new file mode 100644 index 000000000000..eb06d1219be8 --- /dev/null +++ b/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml @@ -0,0 +1,99 @@ +openapi: 3.0.0 +servers: + - url: 'http://petstore.swagger.io/v2' +info: + description: >- + This is a sample server Petstore server that uses polymorphism and inheritance with a discriminator. + version: 1.0.0 + title: OpenAPI Petstore + license: + name: Apache-2.0 + url: 'https://www.apache.org/licenses/LICENSE-2.0.html' + +tags: + - name: pet + description: Everything about your Pets + +paths: + /pets: + post: + operationId: createPet + security: [] + tags: [ pet ] + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/PetRequest' + responses: + '201': + description: Pet created successfully + content: + application/json: + schema: + $ref: '#/components/schemas/PetResponse' + +components: + schemas: + PetRequest: + type: object + required: + - petType + properties: + petType: + type: string + name: + type: string + oneOf: + - $ref: '#/components/schemas/CatRequest' + - $ref: '#/components/schemas/DogRequest' + discriminator: + propertyName: petType + mapping: + CAT: '#/components/schemas/CatRequest' + DOG: '#/components/schemas/DogRequest' + CatRequest: + allOf: + - $ref: '#/components/schemas/PetRequest' + - type: object + properties: + indoor: + type: boolean + DogRequest: + allOf: + - $ref: '#/components/schemas/PetRequest' + - type: object + properties: + bark: + type: string + + PetResponse: + type: object + required: + - petType + oneOf: + - $ref: '#/components/schemas/CatResponse' + - $ref: '#/components/schemas/DogResponse' + discriminator: + propertyName: petType + mapping: + CAT: '#/components/schemas/CatResponse' + DOG: '#/components/schemas/DogResponse' + + CatResponse: + type: object + properties: + indoor: + type: boolean + petType: + type: string + enum: [CAT] + DogResponse: + type: object + properties: + bark: + type: string + petType: + type: string + enum: [DOG] From 0ee26c1d58704e5edcc3412d537d36475346bff7 Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 23:07:41 +0000 Subject: [PATCH 2/6] fixed discriminator --- .../codegen/languages/JavaJAXRSSpecServerCodegen.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index 3eb5c422b6f9..6fcf2560bc81 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -332,8 +332,8 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert public Map postProcessAllModels(Map objs) { Map result = super.postProcessAllModels(objs); for (ModelsMap modelsMap : result.values()) { - for (ModelMap mo : modelsMap.getModels()) { - CodegenModel cm = mo.getModel(); + for (ModelMap modelMap : modelsMap.getModels()) { + CodegenModel cm = modelMap.getModel(); if (cm.parentModel != null) { CodegenDiscriminator discriminator = cm.parentModel.getDiscriminator(); if (discriminator != null) { From 2ba1c23dc02818d7ad093d0083d9cb37f38397de Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 23:08:32 +0000 Subject: [PATCH 3/6] fixed discriminator --- .../codegen/languages/JavaJAXRSSpecServerCodegen.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index 6fcf2560bc81..32319670faf7 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -333,13 +333,13 @@ public Map postProcessAllModels(Map objs) Map result = super.postProcessAllModels(objs); for (ModelsMap modelsMap : result.values()) { for (ModelMap modelMap : modelsMap.getModels()) { - CodegenModel cm = modelMap.getModel(); - if (cm.parentModel != null) { - CodegenDiscriminator discriminator = cm.parentModel.getDiscriminator(); + CodegenModel model = modelMap.getModel(); + if (model.parentModel != null) { + CodegenDiscriminator discriminator = model.parentModel.getDiscriminator(); if (discriminator != null) { for (CodegenDiscriminator.MappedModel mappedModel : discriminator.getMappedModels()) { - if (mappedModel.getModelName().equals(cm.name)) { - cm.getVendorExtensions().put("x-discriminator-value", mappedModel.getMappingName()); + if (mappedModel.getModelName().equals(model.name)) { + model.getVendorExtensions().put("x-discriminator-value", mappedModel.getMappingName()); break; } } From 36fcaee2672cbdc74bf267af55a98f36d8a0e346 Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 23:10:55 +0000 Subject: [PATCH 4/6] fixed discriminator --- .../languages/JavaJAXRSSpecServerCodegen.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java index 32319670faf7..a2c946454091 100644 --- a/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java +++ b/modules/openapi-generator/src/main/java/org/openapitools/codegen/languages/JavaJAXRSSpecServerCodegen.java @@ -328,6 +328,18 @@ public void postProcessModelProperty(CodegenModel model, CodegenProperty propert } } + @Override + public ModelsMap postProcessModels(ModelsMap objs) { + return super.postProcessModels(objs); + } + + @Override + public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List allModels) { + objs = super.postProcessOperationsWithModels(objs, allModels); + removeImport(objs, "java.util.List"); + return objs; + } + @Override public Map postProcessAllModels(Map objs) { Map result = super.postProcessAllModels(objs); @@ -349,17 +361,4 @@ public Map postProcessAllModels(Map objs) } return result; } - - @Override - public ModelsMap postProcessModels(ModelsMap objs) { - return super.postProcessModels(objs); - } - - @Override - public OperationsMap postProcessOperationsWithModels(OperationsMap objs, List allModels) { - objs = super.postProcessOperationsWithModels(objs, allModels); - removeImport(objs, "java.util.List"); - return objs; - } - } From d533b175cca5c7a80a8b9b516d242d5f95acfb27 Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 23:28:59 +0000 Subject: [PATCH 5/6] fixed discriminator --- .../3_0/jaxrs/pestore-with-discriminator.yaml | 32 +------------------ 1 file changed, 1 insertion(+), 31 deletions(-) diff --git a/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml b/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml index eb06d1219be8..6259b82bbca3 100644 --- a/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml +++ b/modules/openapi-generator/src/test/resources/3_0/jaxrs/pestore-with-discriminator.yaml @@ -32,7 +32,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/PetResponse' + $ref: '#/components/schemas/PetRequest' components: schemas: @@ -67,33 +67,3 @@ components: properties: bark: type: string - - PetResponse: - type: object - required: - - petType - oneOf: - - $ref: '#/components/schemas/CatResponse' - - $ref: '#/components/schemas/DogResponse' - discriminator: - propertyName: petType - mapping: - CAT: '#/components/schemas/CatResponse' - DOG: '#/components/schemas/DogResponse' - - CatResponse: - type: object - properties: - indoor: - type: boolean - petType: - type: string - enum: [CAT] - DogResponse: - type: object - properties: - bark: - type: string - petType: - type: string - enum: [DOG] From 763a35407bb09741c8e4d9fd2295795c14fe75e4 Mon Sep 17 00:00:00 2001 From: Ignacio Vidal Date: Sat, 28 Feb 2026 23:31:31 +0000 Subject: [PATCH 6/6] fixed discriminator --- .../codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java index fa318952bc81..b360a6f49c4c 100644 --- a/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java +++ b/modules/openapi-generator/src/test/java/org/openapitools/codegen/java/jaxrs/JavaJAXRSSpecServerCodegenTest.java @@ -1268,5 +1268,4 @@ public void testDiscriminatorMappingUsedInJsonTypeName() throws Exception { .fileContains("@JsonTypeName(\"DOG\")") .fileDoesNotContain("@JsonTypeName(\"DogRequest\")"); } - }