0
ジャクソンを使用してscalaにkafka jsonデシリアライザを作成していますが、jacksonのreadValue()
メソッドにジェネリックタイプのクラスを提供することに問題があります。たとえば:Scala classOfカフカjsonデシリアライザのジェネリックタイプ
...
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 = {}
}
はdeserialize
方法でmapper.readValue(bytes, classOf[T])
に注目してください。コンパイルに失敗しましたが、 "クラスタイプが必要ですがTが見つかりました"。
どうすればいいですか?
私は実際にはなく、 'バインドコンテキストことを試してみました[T:ClassTag]:*クラスcom.meをインスタンス化できませんでした'により自動的にそれをインスタンス化カフカができなくなり、プライマリコンストラクタの引数なしの署名を変更するようです.serialization.JsonDeserializer publicで引数のないコンストラクタはありますか?* – novon
@novon残念ながら、それは不可能です。特定のタイプの 'Foo'では、' OptFooDeserializer extends JsonDeserializer [Foo] 'クラスを簡単に作成し、' OptFooDeserializer'を使うことができます。 – ephemient
それは感謝します、ありがとう。 – novon