Skip to content

Commit ccd2bbe

Browse files
Support for @JsonTypeInfo(use=Id.CLASS) (refs #189)
1 parent 40e1caa commit ccd2bbe

File tree

2 files changed

+59
-2
lines changed

2 files changed

+59
-2
lines changed

typescript-generator-core/src/main/java/cz/habarta/typescript/generator/parser/Jackson2Parser.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ private BeanModel parseBean(SourceType<Class<?>> sourceClass) {
121121
} else if (isSupported(parentJsonTypeInfo = getAnnotationRecursive(sourceClass.type, JsonTypeInfo.class))) {
122122
// this is child class
123123
discriminantProperty = getDiscriminantPropertyName(parentJsonTypeInfo);
124-
discriminantLiteral = getTypeName(sourceClass.type);
124+
discriminantLiteral = getTypeName(parentJsonTypeInfo, sourceClass.type);
125125
} else {
126126
// not part of explicit hierarchy
127127
discriminantProperty = null;
@@ -172,7 +172,11 @@ private String getDiscriminantPropertyName(JsonTypeInfo jsonTypeInfo) {
172172
: jsonTypeInfo.property();
173173
}
174174

175-
private String getTypeName(final Class<?> cls) {
175+
private String getTypeName(JsonTypeInfo parentJsonTypeInfo, final Class<?> cls) {
176+
// Id.CLASS
177+
if (parentJsonTypeInfo.use() == JsonTypeInfo.Id.CLASS) {
178+
return cls.getName();
179+
}
176180
// find @JsonTypeName recursively
177181
final JsonTypeName jsonTypeName = getAnnotationRecursive(cls, JsonTypeName.class);
178182
if (jsonTypeName != null && !jsonTypeName.value().isEmpty()) {

typescript-generator-core/src/test/java/cz/habarta/typescript/generator/TaggedUnionsTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.fasterxml.jackson.annotation.JsonSubTypes;
55
import com.fasterxml.jackson.annotation.JsonTypeInfo;
66
import com.fasterxml.jackson.annotation.JsonTypeName;
7+
import com.fasterxml.jackson.databind.ObjectMapper;
78
import java.util.List;
89
import org.junit.Assert;
910
import org.junit.Test;
@@ -120,6 +121,23 @@ private static interface DiamondC extends DiamondB1, DiamondB2 {
120121
public String getC();
121122
}
122123

124+
@JsonTypeInfo(use=JsonTypeInfo.Id.CLASS, include=JsonTypeInfo.As.PROPERTY, property="@class")
125+
@JsonSubTypes({
126+
@JsonSubTypes.Type(DieselCar.class),
127+
@JsonSubTypes.Type(ElectricCar.class),
128+
})
129+
private static class Car {
130+
public String name;
131+
}
132+
133+
private static class DieselCar extends Car {
134+
public double fuelTankCapacityInLiters;
135+
}
136+
137+
private static class ElectricCar extends Car {
138+
public double batteryCapacityInKWh;
139+
}
140+
123141
@Test
124142
public void testTaggedUnions() {
125143
final Settings settings = TestUtils.settings();
@@ -295,4 +313,39 @@ public void testTaggedUnionsWithDiamond() {
295313
Assert.assertEquals(expected, output);
296314
}
297315

316+
@Test
317+
public void testIdClass() {
318+
final Settings settings = TestUtils.settings();
319+
final String output = new TypeScriptGenerator(settings).generateTypeScript(Input.from(Car.class));
320+
System.out.println(output);
321+
final String expected = (
322+
"\n" +
323+
"interface Car {\n" +
324+
" '@class': 'cz.habarta.typescript.generator.TaggedUnionsTest$DieselCar' | 'cz.habarta.typescript.generator.TaggedUnionsTest$ElectricCar';\n" +
325+
" name: string;\n" +
326+
"}\n" +
327+
"\n" +
328+
"interface DieselCar extends Car {\n" +
329+
" '@class': 'cz.habarta.typescript.generator.TaggedUnionsTest$DieselCar';\n" +
330+
" fuelTankCapacityInLiters: number;\n" +
331+
"}\n" +
332+
"\n" +
333+
"interface ElectricCar extends Car {\n" +
334+
" '@class': 'cz.habarta.typescript.generator.TaggedUnionsTest$ElectricCar';\n" +
335+
" batteryCapacityInKWh: number;\n" +
336+
"}\n" +
337+
"\n" +
338+
"type CarUnion = DieselCar | ElectricCar;\n" +
339+
""
340+
).replace('\'', '"');
341+
Assert.assertEquals(expected, output);
342+
}
343+
344+
public static void main(String[] args) throws Exception {
345+
final ElectricCar electricCar = new ElectricCar();
346+
electricCar.name = "Tesla";
347+
electricCar.batteryCapacityInKWh = 75; // kWh
348+
System.out.println(new ObjectMapper().writeValueAsString(electricCar));
349+
}
350+
298351
}

0 commit comments

Comments
 (0)