Skip to content

Commit a94cfdf

Browse files
committed
Merge branch 'develop' into v2.7
2 parents b37af8d + e359299 commit a94cfdf

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

src/main/scala/com/github/swagger/scala/converter/SwaggerScalaModelConverter.scala

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
209209
schemaProperties.get(propertyName).foreach { property =>
210210
Option(PrimitiveType.fromType(erasedType)).foreach { primitiveType =>
211211
if (isOptional) {
212-
schema.addProperty(propertyName, correctSchema(property, primitiveType))
212+
schema.addProperty(propertyName, tryCorrectSchema(property, primitiveType))
213213
}
214214
if (isIterable(propertyClass) && !isMap(propertyClass)) {
215215
schema.addProperty(propertyName, updateTypeOnItemsSchema(primitiveType, property))
@@ -288,23 +288,26 @@ class SwaggerScalaModelConverter extends ModelResolver(SwaggerScalaModelConverte
288288
}
289289

290290
private def updateTypeOnItemsSchema(primitiveType: PrimitiveType, propertySchema: Schema[_]) = {
291-
val updatedSchema = correctSchema(propertySchema.getItems, primitiveType)
291+
val updatedSchema = tryCorrectSchema(propertySchema.getItems, primitiveType)
292292
propertySchema.setItems(updatedSchema)
293293
propertySchema
294294
}
295295

296-
private def correctSchema(itemSchema: Schema[_], primitiveType: PrimitiveType) = {
297-
val primitiveProperty = primitiveType.createProperty()
298-
val propAsString = objectMapper.writeValueAsString(itemSchema)
299-
val correctedSchema = objectMapper.readValue(propAsString, primitiveProperty.getClass)
300-
correctedSchema.setType(primitiveProperty.getType)
301-
Option(itemSchema.getFormat) match {
302-
case Some(_) =>
303-
case _ => correctedSchema.setFormat(primitiveProperty.getFormat)
304-
}
305-
correctedSchema
296+
private[converter] def tryCorrectSchema(itemSchema: Schema[_], primitiveType: PrimitiveType): Schema[_] = {
297+
Try {
298+
val primitiveProperty = primitiveType.createProperty()
299+
val propAsString = objectMapper.writeValueAsString(itemSchema)
300+
val correctedSchema = objectMapper.readValue(propAsString, primitiveProperty.getClass)
301+
correctedSchema.setType(primitiveProperty.getType)
302+
Option(itemSchema.getFormat) match {
303+
case Some(_) =>
304+
case _ => correctedSchema.setFormat(primitiveProperty.getFormat)
305+
}
306+
correctedSchema
307+
}.toOption.getOrElse(itemSchema)
306308
}
307309

310+
308311
private def getRequiredSettings(annotatedType: AnnotatedType): Seq[Boolean] = annotatedType match {
309312
case _: AnnotatedTypeForOption => Seq.empty
310313
case _ => getRequiredSettings(nullSafeSeq(annotatedType.getCtxAnnotations))

src/test/scala/com/github/swagger/scala/converter/ModelPropertyParserTest.scala

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.github.swagger.scala.converter
22

33
import io.swagger.v3.core.converter._
4-
import io.swagger.v3.core.util.Json
4+
import io.swagger.v3.core.util.{Json, PrimitiveType}
55
import io.swagger.v3.oas.models.media._
66
import models.NestingObject.{NestedModelWOptionInt, NoProperties}
77
import models._
@@ -467,6 +467,20 @@ class ModelPropertyParserTest extends AnyFlatSpec with BeforeAndAfterEach with M
467467
Json.mapper().writeValueAsString(model.value)
468468
}
469469

470+
it should "default to supplied schema if it can't be corrected" in new PropertiesScope[ModelWMapStringCaseClass] {
471+
schemas should have size 2
472+
473+
val mapField = model.value.getProperties.get("maybeMapStringCaseClass")
474+
mapField shouldBe a[MapSchema]
475+
mapField.getAdditionalProperties shouldBe a[Schema[_]]
476+
mapField.getAdditionalProperties.asInstanceOf[Schema[_]].get$ref() shouldBe "#/components/schemas/SomeCaseClass"
477+
478+
479+
val caseClassField = schemas("SomeCaseClass")
480+
caseClassField shouldBe a[Schema[_]]
481+
caseClassField.getProperties.get("field") shouldBe an[IntegerSchema]
482+
}
483+
470484
it should "process Model with Scala Seq" in new PropertiesScope[ModelWSeqString] {
471485
schemas should have size 1
472486
val stringsField = model.value.getProperties.get("strings")

src/test/scala/models/ModelWSeqString.scala

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ case class ModelWJavaListString(strings: java.util.List[String])
88

99
case class ModelWMapString(strings: Map[String, String])
1010

11+
case class SomeCaseClass(field: Int)
12+
13+
case class ModelWMapStringCaseClass(maybeMapStringCaseClass: Option[Map[String, SomeCaseClass]])
14+
1115
case class ModelWJavaMapString(strings: java.util.Map[String, String])

0 commit comments

Comments
 (0)