Skip to content

Commit d3dde37

Browse files
authored
[Java] ensure JsonTypeName not generated for class implementing oneOf with discriminator (#24024)
* fix 23997: ensure that no JsonTypeName is created when the parent interface has a discriminator mapping * add test for @JsonTypeInfo * Fix Cubic findings
1 parent 8759d96 commit d3dde37

3 files changed

Lines changed: 93 additions & 0 deletions

File tree

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,14 @@ public Map<String, ModelsMap> postProcessAllModels(Map<String, ModelsMap> objs)
577577
}
578578
// if this is oneOf interface, make sure we include the necessary imports for it
579579
addImportsToOneOfInterface(modelsImports);
580+
//
581+
// ensure that no JsonTypeName is created when the parent interface has a discriminator mapping
582+
if (cm.discriminator != null && cm.discriminator.getMappedModels() != null && !cm.discriminator.getMappedModels().isEmpty()) {
583+
cm.discriminator.getMappedModels().stream()
584+
.map(MappedModel::getModel)
585+
.filter(Objects::nonNull)
586+
.forEach(model -> model.setHasDiscriminatorWithNonEmptyMapping(true));
587+
}
580588
}
581589
}
582590
}

modules/openapi-generator/src/test/java/org/openapitools/codegen/java/spring/SpringCodegenTest.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8145,4 +8145,21 @@ void schemaMappingWithNullableAllOfRendersNullableJavaProperty() throws IOExcept
81458145
JavaFileAssert.assertThat(files.get("MyObject.java"))
81468146
.assertProperty("optionalRef").withType("JsonNullable<com.example.ExternalModel>");
81478147
}
8148+
8149+
@Test
8150+
void issue24003() throws IOException {
8151+
Map<String, File> files = generateFromContract(
8152+
"src/test/resources/3_0/spring/issue_24003.yaml", SPRING_BOOT,
8153+
Map.of(USE_SPRING_BOOT4, true, MODEL_NAME_SUFFIX, "DTO", INTERFACE_ONLY, "true"));
8154+
JavaFileAssert.assertThat(files.get("BrLockDTO.java")).isInterface()
8155+
.assertTypeAnnotations()
8156+
.containsWithNameAndAttributes("JsonTypeInfo", Map.of("use", "JsonTypeInfo.Id.NAME", "include", "JsonTypeInfo.As.PROPERTY", "property", "\"lockType\"", "visible", "true"))
8157+
.containsWithName("JsonSubTypes")
8158+
.recursivelyContainsWithNameAndAttributes("JsonSubTypes.Type", Map.of("value", "ComponentBrLockDTO.class", "name", "\"COMPONENT\""))
8159+
.recursivelyContainsWithNameAndAttributes("JsonSubTypes.Type", Map.of("value", "UserBrLockDTO.class", "name", "\"USER\""));
8160+
JavaFileAssert.assertThat(files.get("ComponentBrLockDTO.java")).implementsInterfaces("BrLockDTO")
8161+
.fileDoesNotContain("@JsonTypeName");
8162+
JavaFileAssert.assertThat(files.get("UserBrLockDTO.java")).implementsInterfaces("BrLockDTO")
8163+
.fileDoesNotContain("@JsonTypeName");
8164+
}
81488165
}
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
openapi: 3.0.1
2+
info:
3+
title: x-discriminator-value JsonTypeName bug
4+
version: 1.0.0
5+
paths:
6+
/locks:
7+
get:
8+
operationId: getLocks
9+
responses:
10+
'200':
11+
description: list of locks
12+
content:
13+
application/json:
14+
schema:
15+
type: array
16+
items:
17+
$ref: '#/components/schemas/BrLock'
18+
components:
19+
schemas:
20+
LockType:
21+
type: string
22+
enum:
23+
- USER
24+
- COMPONENT
25+
26+
BrLock:
27+
type: object
28+
required:
29+
- lockType
30+
properties:
31+
lockType:
32+
$ref: '#/components/schemas/LockType'
33+
oneOf:
34+
- $ref: '#/components/schemas/UserBrLock'
35+
- $ref: '#/components/schemas/ComponentBrLock'
36+
discriminator:
37+
propertyName: lockType
38+
mapping:
39+
USER: '#/components/schemas/UserBrLock'
40+
COMPONENT: '#/components/schemas/ComponentBrLock'
41+
42+
BaseBrLock:
43+
type: object
44+
required:
45+
- lockType
46+
properties:
47+
lockType:
48+
$ref: '#/components/schemas/LockType'
49+
50+
UserBrLock:
51+
allOf:
52+
- $ref: '#/components/schemas/BaseBrLock'
53+
- type: object
54+
required:
55+
- userId
56+
properties:
57+
userId:
58+
type: string
59+
60+
ComponentBrLock:
61+
allOf:
62+
- $ref: '#/components/schemas/BaseBrLock'
63+
- type: object
64+
required:
65+
- componentId
66+
properties:
67+
componentId:
68+
type: string

0 commit comments

Comments
 (0)