Kafka json反序列化程序中泛型类型的Scala类
我正在使用Jackson在scala中编写kafka json反序列化程序,但在提供Jackson的Kafka json反序列化程序中泛型类型的Scala类,scala,jackson,apache-kafka,jackson-module-scala,Scala,Jackson,Apache Kafka,Jackson Module Scala,我正在使用Jackson在scala中编写kafka json反序列化程序,但在提供Jackson的readValue()方法泛型类型的类时遇到问题。例如: ... import org.apache.kafka.common.serialization.Deserializer class JsonDeserializer[T] extends Deserializer[Option[T]] { val mapper = (new ObjectMapper() with ScalaOb
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(字节,classOf[T])
。编译失败,出现“需要类类型,但未找到”
如何做到这一点?Java中的泛型类型在运行时被擦除,因此如果不显式地传递它,就无法恢复
类
就Java而言,这是明确的。您可以使用(隐式ct:ClassTag[T])
或速记[T:ClassTag]
在构造时(隐式)获取类标记,这允许您稍后检索类
import scala.reflect._
class JsonDeserializer[T: ClassTag] extends Deserializer[Option[T]] {
...
mapper.readValue(bytes, classTag[T].runtimeClass.asInstanceOf[Class[T]])
Java中的泛型类型在运行时被擦除,因此如果不显式地传入类,就无法恢复类
就Java而言,这是明确的。您可以使用(隐式ct:ClassTag[T])
或速记[T:ClassTag]
在构造时(隐式)获取类标记,这允许您稍后检索类
import scala.reflect._
class JsonDeserializer[T: ClassTag] extends Deserializer[Option[T]] {
...
mapper.readValue(bytes, classTag[T].runtimeClass.asInstanceOf[Class[T]])
实际上我试过了,但是上下文绑定的[T:ClassTag]
似乎会自动更改主构造函数的无参数签名,这使得Kafka无法实例化它,原因是:无法实例化类com.me.serialization.JsonDeserializer它是否具有公共无参数构造函数?@novon不幸的是,这是不可能的。对于任何特定类型的Foo
,您都可以轻松创建一个类OptFooDeserializer扩展JsonDeserializer[Foo]
,并使用OptFooDeserializer
。实际上我已经尝试过了,但是上下文绑定了[T:ClassTag]
似乎会自动更改主构造函数的无参数签名,这使得Kafka无法实例化它,原因是:无法实例化类com.me.serialization.JsonDeserializer它是否具有公共无参数构造函数?@novon很遗憾,这是不可能的。对于任何特定类型的Foo
,您都可以轻松创建一个类OptFooDeserializer extends JsonDeserializer[Foo]
并使用OptFooDeserializer
。