Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kafka json反序列化程序中泛型类型的Scala类_Scala_Jackson_Apache Kafka_Jackson Module Scala - Fatal编程技术网

Kafka json反序列化程序中泛型类型的Scala类

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

我正在使用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 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