Skip to content

Commit 20cc9a5

Browse files
committed
Merge pull request #739 from tpetr/master
Unwrap optional types in models
2 parents 7b45b09 + 4cd25c6 commit 20cc9a5

File tree

4 files changed

+34
-1
lines changed

4 files changed

+34
-1
lines changed

modules/swagger-core/src/main/scala/com/wordnik/swagger/converter/ModelPropertyParser.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,11 @@ class ModelPropertyParser(cls: Class[_], t: Map[String, String] = Map.empty) (im
392392
}
393393

394394
def getDataType(genericReturnType: Type, returnType: Type, isSimple: Boolean = false): String = {
395-
if (TypeUtil.isParameterizedList(genericReturnType)) {
395+
if (TypeUtil.isOptionalType(genericReturnType)) {
396+
val parameterizedType = genericReturnType.asInstanceOf[java.lang.reflect.ParameterizedType]
397+
val valueType = parameterizedType.getActualTypeArguments.head
398+
getDataType(valueType, valueType, isSimple)
399+
} else if (TypeUtil.isParameterizedList(genericReturnType)) {
396400
val parameterizedType = genericReturnType.asInstanceOf[java.lang.reflect.ParameterizedType]
397401
val valueType = parameterizedType.getActualTypeArguments.head
398402
"List[" + getDataType(valueType, valueType, isSimple) + "]"

modules/swagger-core/src/main/scala/com/wordnik/swagger/core/util/TypeUtil.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ object TypeUtil {
5959
}).asScala.toSet
6060
}
6161

62+
def isOptionalType(gt: Type): Boolean = {
63+
if (classOf[ParameterizedType].isAssignableFrom(gt.getClass)) {
64+
val tp = gt.asInstanceOf[ParameterizedType].getRawType
65+
(tp == classOf[Option[_]] || tp.asInstanceOf[Class[_]].getSimpleName.equals("Optional"))
66+
}
67+
else false
68+
}
69+
6270
def isParameterizedList(gt: Type): Boolean = {
6371
if (classOf[ParameterizedType].isAssignableFrom(gt.getClass)) {
6472
val tp = gt.asInstanceOf[ParameterizedType].getRawType
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package converter
2+
3+
import models._
4+
5+
import com.wordnik.swagger.converter._
6+
7+
import com.wordnik.swagger.core.util._
8+
import org.scalatest.{Matchers, FlatSpec}
9+
10+
class ModelWithOptionalFieldsTest extends FlatSpec with Matchers {
11+
val models = ModelConverters.readAll(classOf[ModelWithOptionalFields])
12+
JsonSerializer.asJson(models) should be ("""[{"id":"ModelWithOptionalFields","properties":{"string":{"type":"string"},"integer":{"type":"integer","format":"int32"}}}]""")
13+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package converter.models;
2+
3+
import com.google.common.base.Optional;
4+
5+
public class ModelWithOptionalFields {
6+
public Optional<String> string;
7+
public Optional<Integer> integer;
8+
}

0 commit comments

Comments
 (0)