Skip to content

Commit e0b2e93

Browse files
dpegerfrantuma
authored andcommitted
#4103 Support for Jackson reference types
In addition to the hard coded `Optional` reference types the type information from jackson is used to unwrap additional reference types (e.g. `AtomicReference`)
1 parent 2aab91e commit e0b2e93

File tree

2 files changed

+47
-3
lines changed

2 files changed

+47
-3
lines changed

modules/swagger-core/src/main/java/io/swagger/jackson/ModelResolver.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ public Property resolveProperty(JavaType propType,
170170
if (propType.isEnumType()) {
171171
property = new StringProperty();
172172
_addEnumProps(propType.getRawClass(), (StringProperty) property);
173-
} else if (_isOptionalType(propType)) {
173+
} else if (_isReferenceType(propType)) {
174174
property = context.resolveProperty(propType.containedType(0), null);
175175
} else {
176176
// complex type
@@ -191,9 +191,9 @@ public Property resolveProperty(JavaType propType,
191191
return property;
192192
}
193193

194-
private boolean _isOptionalType(JavaType propType) {
194+
private boolean _isReferenceType(JavaType propType) {
195195
return Arrays.asList("com.google.common.base.Optional", "java.util.Optional")
196-
.contains(propType.getRawClass().getCanonicalName());
196+
.contains(propType.getRawClass().getCanonicalName()) || propType.isReferenceType();
197197
}
198198

199199
@Override

modules/swagger-core/src/test/java/io/swagger/jackson/ModelResolverTest.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,26 @@
11
package io.swagger.jackson;
22

3+
import com.fasterxml.jackson.databind.BeanDescription;
34
import com.fasterxml.jackson.databind.JavaType;
45
import com.fasterxml.jackson.databind.ObjectMapper;
6+
import com.fasterxml.jackson.databind.introspect.BeanPropertyDefinition;
7+
import com.fasterxml.jackson.databind.type.TypeFactory;
58
import io.swagger.converter.ModelConverterContextImpl;
69
import io.swagger.models.Link;
710
import io.swagger.models.Model;
811
import io.swagger.models.ModelImpl;
912
import io.swagger.models.Xml;
13+
import io.swagger.models.properties.DecimalProperty;
14+
import io.swagger.models.properties.Property;
1015
import org.testng.annotations.DataProvider;
1116
import org.testng.annotations.Test;
1217

1318
import javax.xml.bind.annotation.XmlRootElement;
1419

20+
import java.lang.annotation.Annotation;
21+
import java.math.BigDecimal;
22+
import java.util.concurrent.atomic.AtomicReference;
23+
1524
import static org.testng.Assert.*;
1625

1726
public class ModelResolverTest extends SwaggerTestBase {
@@ -51,4 +60,39 @@ public static class TypeWithNamespace {
5160
public static class TypeWithoutNamespace {
5261
}
5362

63+
@Test
64+
public void testResolvePropertyWithAtomicReference() {
65+
final ObjectMapper mapper = mapper();
66+
final ModelResolver modelResolver = new ModelResolver(mapper);
67+
68+
final JavaType javaType = TypeFactory.defaultInstance().constructType(TypeWithAtomicReferenceMember.class);
69+
final BeanDescription beanDescription = mapper.getSerializationConfig().introspect(javaType);
70+
71+
JavaType atomicReferenceBigDecimalType = null;
72+
for (final BeanPropertyDefinition propDef : beanDescription.findProperties()) {
73+
if ("member".equals(propDef.getName())) {
74+
atomicReferenceBigDecimalType = propDef.getPrimaryType();
75+
}
76+
}
77+
assertNotNull(atomicReferenceBigDecimalType, "Failed to read atomic reference field 'member'");
78+
79+
final Property actualProperty = modelResolver.resolveProperty(atomicReferenceBigDecimalType,
80+
new ModelConverterContextImpl(modelResolver), new Annotation[0], null);
81+
assertEquals(actualProperty.getType(), DecimalProperty.TYPE, "Got wrong type for AtomicReference member");
82+
}
83+
84+
@SuppressWarnings("unused")
85+
private static final class TypeWithAtomicReferenceMember {
86+
AtomicReference<BigDecimal> member;
87+
88+
public AtomicReference<BigDecimal> getMember() {
89+
return member;
90+
}
91+
92+
public void setMember(AtomicReference<BigDecimal> member) {
93+
this.member = member;
94+
}
95+
}
96+
97+
5498
}

0 commit comments

Comments
 (0)