Skip to content

Commit f557835

Browse files
fixed duplicate property added by @JsonTypeInfo (fixes #55)
1 parent 2277d4b commit f557835

File tree

4 files changed

+39
-15
lines changed

4 files changed

+39
-15
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,6 @@ public boolean isHandled(Annotation ann) {
3737
protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
3838
final List<PropertyModel> properties = new ArrayList<>();
3939

40-
final JsonTypeInfo jsonTypeInfo = sourceClass.type.getAnnotation(JsonTypeInfo.class);
41-
if (jsonTypeInfo != null && jsonTypeInfo.include() == JsonTypeInfo.As.PROPERTY) {
42-
properties.add(new PropertyModel(jsonTypeInfo.property(), String.class, false, null, null));
43-
}
44-
4540
final BeanHelper beanHelper = getBeanHelper(sourceClass.type);
4641
if (beanHelper != null) {
4742
for (BeanPropertyWriter beanPropertyWriter : beanHelper.getProperties()) {
@@ -63,6 +58,13 @@ protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
6358
}
6459
}
6560

61+
final JsonTypeInfo jsonTypeInfo = sourceClass.type.getAnnotation(JsonTypeInfo.class);
62+
if (jsonTypeInfo != null && jsonTypeInfo.include() == JsonTypeInfo.As.PROPERTY) {
63+
if (!containsProperty(properties, jsonTypeInfo.property())) {
64+
properties.add(new PropertyModel(jsonTypeInfo.property(), String.class, false, null, null));
65+
}
66+
}
67+
6668
final JsonSubTypes jsonSubTypes = sourceClass.type.getAnnotation(JsonSubTypes.class);
6769
if (jsonSubTypes != null) {
6870
for (JsonSubTypes.Type type : jsonSubTypes.value()) {

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,6 @@ public Jackson2Parser(Settings settings, TypeProcessor typeProcessor) {
2424
protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
2525
final List<PropertyModel> properties = new ArrayList<>();
2626

27-
final JsonTypeInfo jsonTypeInfo = sourceClass.type.getAnnotation(JsonTypeInfo.class);
28-
if (jsonTypeInfo != null && jsonTypeInfo.include() == JsonTypeInfo.As.PROPERTY) {
29-
properties.add(new PropertyModel(jsonTypeInfo.property(), String.class, false, null, null));
30-
}
31-
3227
final BeanHelper beanHelper = getBeanHelper(sourceClass.type);
3328
if (beanHelper != null) {
3429
for (BeanPropertyWriter beanPropertyWriter : beanHelper.getProperties()) {
@@ -50,6 +45,13 @@ protected BeanModel parseBean(SourceType<Class<?>> sourceClass) {
5045
}
5146
}
5247

48+
final JsonTypeInfo jsonTypeInfo = sourceClass.type.getAnnotation(JsonTypeInfo.class);
49+
if (jsonTypeInfo != null && jsonTypeInfo.include() == JsonTypeInfo.As.PROPERTY) {
50+
if (!containsProperty(properties, jsonTypeInfo.property())) {
51+
properties.add(new PropertyModel(jsonTypeInfo.property(), String.class, false, null, null));
52+
}
53+
}
54+
5355
final JsonSubTypes jsonSubTypes = sourceClass.type.getAnnotation(JsonSubTypes.class);
5456
if (jsonSubTypes != null) {
5557
for (JsonSubTypes.Type type : jsonSubTypes.value()) {

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,13 @@ private TypeProcessor.Result processType(Type type) {
9999
return typeProcessor.processType(type, new TypeProcessor.Context(new SymbolTable(settings), typeProcessor));
100100
}
101101

102+
public static boolean containsProperty(List<PropertyModel> properties, String propertyName) {
103+
for (PropertyModel property : properties) {
104+
if (property.getName().equals(propertyName)) {
105+
return true;
106+
}
107+
}
108+
return false;
109+
}
110+
102111
}

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
package cz.habarta.typescript.generator;
33

44
import cz.habarta.typescript.generator.parser.*;
5-
import com.fasterxml.jackson.annotation.JsonProperty;
5+
import com.fasterxml.jackson.annotation.*;
66
import org.junit.Assert;
77
import org.junit.Test;
88

@@ -16,7 +16,6 @@ public void test() {
1616
final Model model = jacksonParser.parseModel(bean);
1717
Assert.assertTrue(model.getBeans().size() > 0);
1818
final BeanModel beanModel = model.getBeans().get(0);
19-
System.out.println("beanModel: " + beanModel);
2019
Assert.assertEquals("DummyBean", beanModel.getBeanClass().getSimpleName());
2120
Assert.assertTrue(beanModel.getProperties().size() > 0);
2221
Assert.assertEquals("firstProperty", beanModel.getProperties().get(0).getName());
@@ -25,16 +24,23 @@ public void test() {
2524
@Test
2625
public void testChangedNameProperty() {
2726
final Jackson2Parser jacksonParser = getJackson2Parser();
28-
final Class<?> bean = DummyBeanJackson2.class;
29-
final Model model = jacksonParser.parseModel(bean);
27+
final Model model = jacksonParser.parseModel(DummyBeanJackson2.class);
3028
Assert.assertTrue(model.getBeans().size() > 0);
3129
final BeanModel beanModel = model.getBeans().get(0);
32-
System.out.println("beanModel: " + beanModel);
3330
Assert.assertEquals("DummyBeanJackson2", beanModel.getBeanClass().getSimpleName());
3431
Assert.assertTrue(beanModel.getProperties().size() > 0);
3532
Assert.assertEquals("changedNameProperty", beanModel.getProperties().get(0).getName());
3633
}
3734

35+
@Test
36+
public void testConflictingJsonTypeInfoProperty() {
37+
final Jackson2Parser jacksonParser = getJackson2Parser();
38+
final Model model = jacksonParser.parseModel(InheritedClass.class);
39+
Assert.assertTrue(model.getBeans().size() > 0);
40+
final BeanModel beanModel = model.getBeans().get(0);
41+
Assert.assertEquals(1, beanModel.getProperties().size());
42+
}
43+
3844
static Jackson2Parser getJackson2Parser() {
3945
final Settings settings = new Settings();
4046
return new Jackson2Parser(settings, new DefaultTypeProcessor());
@@ -47,4 +53,9 @@ public static class DummyBeanJackson2 {
4753

4854
}
4955

56+
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
57+
public class InheritedClass {
58+
public String type;
59+
}
60+
5061
}

0 commit comments

Comments
 (0)