Мы все знаем, что общие типы подлежат стиранию типов под Java и Scala. Но мы столкнулись с какой-то странной проблемой в Scala, используя Jackson и модуль Scala Jackson.Странные проблемы десериализации с использованием общих типов с использованием Scala и Jackson и java.lang.Integer или scala.Int
Я создал небольшой тест, чтобы показать проблему.
import com.fasterxml.jackson.databind.ObjectMapper
import com.fasterxml.jackson.module.scala.DefaultScalaModule
object GenericTest {
case class TestWithInt(id: Option[Int])
case class TestWithInteger(id: Option[Integer])
def main(args: Array[String]) {
val mapper = new ObjectMapper()
mapper.registerModule(DefaultScalaModule)
// Test with scala's Int
val test = mapper.readValue[TestWithInt]("""{ "id" : 5 }""", classOf[TestWithInt])
print("Test 1: ")
println(test.id.get + 1)
val test2 = mapper.readValue[TestWithInt]("""{ "id" : "5" }""", classOf[TestWithInt])
print("Test 2: ")
try {
println(test2.id.get + 1)
} catch {
case e: ClassCastException => println(e.getMessage)
}
// Test with java.lang.Integer
val test3 = mapper.readValue[TestWithInteger]("""{ "id" : 5 }""", classOf[TestWithInteger])
print("Test 3: ")
println(test3.id.get + 1)
val test4 = mapper.readValue[TestWithInteger]("""{ "id" : "5" }""", classOf[TestWithInteger])
print("Test 4: ")
println(test4.id.get + 1)
}
}
Выход из выше:
Test 1: 6
Test 2: java.lang.String cannot be cast to java.lang.Integer
Test 3: 6
Test 4: 6
Где это другой вид поведения взялось? Generic Type Erasure, Jackson, Jackson Scala Module?
Я не достаточно хорошо знаком с Scala, но я предполагаю, что у Jackson есть встроенный конвертер, который знает, как обрабатывать преобразование для типа Java, но не Scala. – chrylis
Хм, может быть ... создал проблему для этого, перекрестные ссылки на этот вопрос: https://github.com/FasterXML/jackson-module-scala/issues/104 – longliveenduro