Skip to content

Commit 7609ec0

Browse files
committed
fix issue 804 - java discriminator mapping
1 parent 313cf27 commit 7609ec0

File tree

3 files changed

+100
-1
lines changed

3 files changed

+100
-1
lines changed

src/main/resources/handlebars/Java/typeInfoAnnotation.mustache

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "{{discriminator.propertyName}}", visible = true )
33
@JsonSubTypes({
44
{{#children}}
5-
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{name}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
5+
@JsonSubTypes.Type(value = {{classname}}.class, name = "{{^vendorExtensions.x-discriminator-value}}{{subtypeName}}{{/vendorExtensions.x-discriminator-value}}{{#vendorExtensions.x-discriminator-value}}{{{vendorExtensions.x-discriminator-value}}}{{/vendorExtensions.x-discriminator-value}}"),
66
{{/children}}
77
}){{/jackson}}

src/test/java/io/swagger/codegen/v3/generators/java/GeneratorResultTestJava.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,51 @@ public void interfaceWithCustomDiscriminator() throws Exception {
9393

9494
FileUtils.deleteDirectory(new File(tmpFolder.getAbsolutePath()));
9595
}
96+
97+
@Test
98+
public void javaCustomDiscriminator() throws Exception {
99+
100+
String name = "java";
101+
String specPath = "3_0_0/javaDiscriminatorExample.yaml";
102+
GenerationRequest.CodegenVersion codegenVersion = GenerationRequest.CodegenVersion.V3;
103+
boolean v2Spec = false; // 3.0 spec
104+
boolean yaml = true;
105+
boolean flattenInlineComposedSchema = true;
106+
String outFolder = null; // temporary folder
107+
108+
File tmpFolder = GeneratorRunner.getTmpFolder();
109+
Assert.assertNotNull(tmpFolder);
110+
111+
List<File> files = GeneratorRunner.runGenerator(
112+
name,
113+
specPath,
114+
codegenVersion,
115+
v2Spec,
116+
yaml,
117+
flattenInlineComposedSchema,
118+
tmpFolder.getAbsolutePath(),
119+
options -> options.setLibrary("resttemplate"));
120+
121+
122+
File interfaceFile = files.stream().filter(f -> f.getName().equals("ResultForSubTypeDTO.java")).findAny().orElseThrow(() -> new RuntimeException("No class generated"));
123+
124+
String interfaceContent = new String(Files.readAllBytes(Paths.get(interfaceFile.toURI())));
125+
126+
Pattern typeInfoPattern = Pattern.compile( "(.*)(@JsonTypeInfo\\()(.*)(}\\))(.*)", Pattern.DOTALL);
127+
128+
Matcher matcher = typeInfoPattern.matcher(interfaceContent);
129+
130+
Assert.assertTrue(matcher.matches(),
131+
"No JsonTypeInfo generated into the interface file");
132+
133+
String generatedTypeInfoLines = matcher.group(2)+matcher.group(3)+matcher.group(4);
134+
135+
Assert.assertEquals( generatedTypeInfoLines, "@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = \"type\", visible = true )" + System.lineSeparator() +
136+
"@JsonSubTypes({" + System.lineSeparator() +
137+
" @JsonSubTypes.Type(value = SubTypeBResultDTO.class, name = \"WeirdlyNamedSubTypeB\")," + System.lineSeparator() +
138+
" @JsonSubTypes.Type(value = SubTypeAResultDTO.class, name = \"SubTypeA\")," + System.lineSeparator() +
139+
"})");
140+
141+
FileUtils.deleteDirectory(new File(tmpFolder.getAbsolutePath()));
142+
}
96143
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
openapi: '3.0.3'
2+
info:
3+
title: 'Discriminator Problem API'
4+
version: '1.0.0'
5+
6+
components:
7+
schemas:
8+
SomeTypeDTO:
9+
type: string
10+
enum:
11+
- SubTypeA
12+
- WeirdlyNamedSubTypeB
13+
14+
ResultForSubTypeDTO:
15+
type: object
16+
properties:
17+
type:
18+
type: string
19+
oneOf:
20+
- $ref: '#/components/schemas/SubTypeAResultDTO'
21+
- $ref: '#/components/schemas/SubTypeBResultDTO'
22+
required:
23+
- type
24+
discriminator:
25+
propertyName: type
26+
mapping:
27+
SubTypeA: '#/components/schemas/SubTypeAResultDTO'
28+
WeirdlyNamedSubTypeB: '#/components/schemas/SubTypeBResultDTO'
29+
30+
SubTypeAResultDTO:
31+
allOf:
32+
- $ref: '#/components/schemas/ResultForSubTypeDTO'
33+
type: object
34+
properties:
35+
some_attribute:
36+
type: string
37+
38+
SubTypeBResultDTO:
39+
allOf:
40+
- $ref: '#/components/schemas/ResultForSubTypeDTO'
41+
type: object
42+
properties:
43+
another_attribute:
44+
type: string
45+
46+
paths:
47+
/repro:
48+
get:
49+
operationId: 'getRepo'
50+
responses:
51+
204:
52+
description: OK

0 commit comments

Comments
 (0)