Scala class在Kafka json反序列化器中的泛型类型

时间:2017-07-21 05:10:45

标签: scala jackson apache-kafka jackson-module-scala

我正在使用杰克逊在scala中编写一个kafka json反序列化器,但是在提供杰克逊的readValue()方法类通用类时遇到了问题。例如:

...
import org.apache.kafka.common.serialization.Deserializer

class JsonDeserializer[T] extends Deserializer[Option[T]] {

  val mapper = (new ObjectMapper() with ScalaObjectMapper)
    .registerModule(DefaultScalaModule)
    .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
    .registerModule(new JavaTimeModule())
    .findAndRegisterModules()
    .asInstanceOf[ObjectMapper with ScalaObjectMapper]

  def deserialize(topic: String, bytes: Array[Byte]): Option[T] = {
    Option(bytes) match {
      case Some(b) => Some(mapper.readValue(bytes, classOf[T]))
      case None => None
    }

  }

  def configure(configs: java.util.Map[String, _], isKey: Boolean) {}
  def close(): Unit = {}
}

请注意mapper.readValue(bytes, classOf[T])方法中的deserialize。编译失败,需要"类类型,但T找到"。

如何做到这一点?

1 个答案:

答案 0 :(得分:1)

Java中的泛型类型在运行时被擦除,因此无法在不明确传递的情况下恢复Class

嗯,明确就Java而言。您可以在构建时使用(implicit ct: ClassTag[T])或速记[T: ClassTag](隐式)获取ClassTag,以便稍后检索Class

import scala.reflect._

class JsonDeserializer[T: ClassTag] extends Deserializer[Option[T]] {
  ...
    mapper.readValue(bytes, classTag[T].runtimeClass.asInstanceOf[Class[T]])