[英]Scala class final def this() declares no public no-argument constructor
試圖構建使用Jackson Jackson 2.6.6和jackson-module-scala的通用Scala 2.11 Jackson序列化程序。 無論出於何種原因,Java都找不到公共的無參數構造函數。 盡管下面的類可以編譯,但我在運行時從Kafka客戶端收到以下錯誤:
Caused by: org.apache.kafka.common.KafkaException: Could not instantiate class ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer Does it have a public no-argument constructor?
at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:318) ~[kafka-clients-0.10.0.0.jar:na]
at org.apache.kafka.common.config.AbstractConfig.getConfiguredInstance(AbstractConfig.java:201) ~[kafka-clients-0.10.0.0.jar:na]
at org.apache.kafka.clients.consumer.KafkaConsumer.<init>(KafkaConsumer.java:671) ~[kafka-clients-0.10.0.0.jar:na]
... 27 common frames omitted
Caused by: java.lang.InstantiationException: ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer
at java.lang.Class.newInstance(Class.java:427) ~[na:1.8.0_51]
at org.apache.kafka.common.utils.Utils.newInstance(Utils.java:314) ~[kafka-clients-0.10.0.0.jar:na]
... 29 common frames omitted
Caused by: java.lang.NoSuchMethodException: ai.bernie.api.util.serialization.kafka.JacksonGenericSerializer.<init>()
at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_51]
at java.lang.Class.newInstance(Class.java:412) ~[na:1.8.0_51]
... 30 common frames omitted
這是課程,我該如何解決? 我嘗試了使用final def
和將private var移到類中的各種組合,盡管我可能做錯了,但還嘗試使用無參數apply
方法創建一個伴隨對象。
class JacksonGenericSerializer[T: Manifest] private (
private var mapper: ObjectMapper with ScalaObjectMapper = null
) extends Closeable with AutoCloseable with Serializer[T] with Deserializer[T] {
final def this() = this(new ObjectMapper(new SmileFactory) with ScalaObjectMapper)
override def configure(map: java.util.Map[String, _], b: Boolean) {
if (mapper == null) {
mapper = new ObjectMapper(new SmileFactory) with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
}
}
override def serialize(s: String, record: T): Array[Byte] = {
try {
mapper.writeValueAsBytes(record)
}
catch {
case e: JsonProcessingException => {
throw new IllegalArgumentException(e)
}
}
}
override def deserialize(s: String, bytes: Array[Byte]): T = {
try {
mapper.readValue[T](bytes)
}
catch {
case e: IOException => {
throw new IllegalArgumentException(e)
}
}
}
override def close {
mapper = null
}
}
我還應該提到我正在使用Google Guice,盡管我對此持懷疑態度,因為它不會影響序列化類本身,而只會注入使用Kafka Consumer / Producer父類,因此會對此產生影響。
因為JacksonGenericSerializer
類型參數具有上下文綁定(即[T: Manifest]
),所以輔助“無參數”構造函數實際上接受一個參數: Manifest[T]
您可以使用javap進行確認:
$ javap JacksonGenericSerializer.class
Compiled from "JacksonGenericSerializer.scala"
public class JacksonGenericSerializer<T> implements java.io.Closeable, java.lang.AutoCloseable, org.apache.kafka.common.serialization.Serializer<T>, org.apache.kafka.common.serialization.Deserializer<T> {
public void configure(java.util.Map<java.lang.String, ?>, boolean);
public byte[] serialize(java.lang.String, T);
public T deserialize(java.lang.String, byte[]);
public void close();
public JacksonGenericSerializer(scala.reflect.Manifest<T>);
}
這個問題涉及一個類似的問題: 如何僅使用零參數構造函數創建通過Java反射綁定上下文的Scala類的新實例?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.