代码之家  ›  专栏  ›  技术社区  ›  novon

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

  •  1
  • novon  · 技术社区  · 7 年前

    我正在使用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(bytes, classOf[T]) deserialize

    1 回复  |  直到 7 年前
        1
  •  4
  •   ephemient    7 年前

    Java中的泛型类型在运行时被擦除,因此无法恢复 Class

    就Java而言,这是明确的。您可以使用 (implicit ct: ClassTag[T]) 或者速记 [T: ClassTag] ClassTag 在施工时,允许您检索

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