我正在使用杰克逊在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找到"。
如何做到这一点?
答案 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]])