jackson-module-scala
jackson-module-scala copied to clipboard
jsonSchema generation for classes extending TraversableOnce return { type: array }
The jsonSchema returned for:
case class WorkingClass(int: Int) {
def iterator: Iterator[Int] = List().toIterator
}
looks correct:
{
"type" : "object",
"id" : "urn:jsonschema:com:ccri:commons:config:schema:ReproduceIssue:WorkingClass",
"properties" : {
"int" : {
"type" : "integer"
}
}
}
But if the class is declared as extending Iterable[Int]
case class FailingClass(int: Int) extends Iterable[Int] {
def iterator: Iterator[Int] = List().toIterator
}
I get:
{
"type" : "array"
}
As far as I can tell, mixing in any trait that subclasses TraversableOnce produces {"type": "array"}.
To reproduce:
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.jsonSchema.customProperties.ValidationSchemaFactoryWrapper
import com.fasterxml.jackson.module.jsonSchema.factories.SchemaFactoryWrapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
import com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper
object JacksonHelper {
val jacksonObjectMapper: ObjectMapper = new ObjectMapper() with ScalaObjectMapper
jacksonObjectMapper.registerModule(DefaultScalaModule)
val writer = jacksonObjectMapper.writer()
val visitor: SchemaFactoryWrapper = new ValidationSchemaFactoryWrapper()
val prettyPrinter = jacksonObjectMapper.writerWithDefaultPrettyPrinter()
def jsonSchema(c: Class[_]) = {
writer.acceptJsonFormatVisitor(c, visitor)
val jsonSchema = visitor.finalSchema()
prettyPrinter.writeValueAsString(jsonSchema)
}
}
object ReproduceIssue extends App {
case class WorkingClass(int: Int) {
def iterator: Iterator[Int] = List().toIterator
}
case class FailingClass(int: Int) extends Iterable[Int] {
def iterator: Iterator[Int] = List().toIterator
}
println("WorkingClass:")
println(JacksonHelper.jsonSchema(classOf[WorkingClass]))
println("FailingClass:")
println(JacksonHelper.jsonSchema(classOf[FailingClass]))
}
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-jsonSchema</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-scala_2.10</artifactId>
<version>2.6.3</version>
</dependency>
Am I doing something wrong, is this not supposed to work, or is it a bug?
jackson-module-jsonSchema support is deprecated and due for removal when jackson 3 is released