Java Scala类final def this()不声明任何公共无参数构造函数
试图构建一个通用的Scala2.11Jackson序列化程序,该程序使用Jackson Smile 2.6.6和Jackson模块Scala。无论出于何种原因,Java都找不到公共的无参数构造函数。尽管下面的类已编译,但我在运行时从Kafka客户端收到以下错误:Java Scala类final def this()不声明任何公共无参数构造函数,java,scala,generics,polymorphism,apache-kafka,Java,Scala,Generics,Polymorphism,Apache Kafka,试图构建一个通用的Scala2.11Jackson序列化程序,该程序使用Jackson Smile 2.6.6和Jackson模块Scala。无论出于何种原因,Java都找不到公共的无参数构造函数。尽管下面的类已编译,但我在运行时从Kafka客户端收到以下错误: Caused by: org.apache.kafka.common.KafkaException: Could not instantiate class ai.bernie.api.util.serialization.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
编辑
我还应该提到,我正在使用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>);
}
$javap JacksonGenericSerializer.class
由“JacksonGenericSerializer.scala”编译而成
公共类JacksonGenericSerializer实现java.io.Closeable、java.lang.AutoCloseable、org.apache.kafka.common.serialization.Serializer、org.apache.kafka.common.serialization.Deserializer{
公共void配置(java.util.Map,布尔值);
公共字节[]序列化(java.lang.String,T);
公共T反序列化(java.lang.String,字节[]);
公共空间关闭();
公共JacksonGenericSerializer(scala.reflect.Manifest);
}
这个问题涉及到一个类似的问题:因为
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>);
}
$javap JacksonGenericSerializer.class
由“JacksonGenericSerializer.scala”编译而成
公共类JacksonGenericSerializer实现java.io.Closeable、java.lang.AutoCloseable、org.apache.kafka.common.serialization.Serializer、org.apache.kafka.common.serialization.Deserializer{
公共void配置(java.util.Map,布尔值);
公共字节[]序列化(java.lang.String,T);
公共T反序列化(java.lang.String,字节[]);
公共空间关闭();
公共JacksonGenericSerializer(scala.reflect.Manifest);
}
这个问题涉及到一个类似的问题:很有趣,所以基本上我想要实现的是几乎不可能的,因为它可以是/或?不可能按原样使用JacksonGenericSerializer-从这里开始最直接的方法是:1)删除上下文限制2)使
JacksonGenericSerializer
抽象并添加一个抽象字段implicit val manifest:manifest[T]
3)实现class JacksonMyTypeSerializer扩展JacksonGenericSerializer[MyType]{implicit val manifest=implicit[manifest[MyType]}
很有趣,所以基本上我想要实现的目标是不可能的,因为它可以是/或?不可能按原样使用JacksonGenericSerializer-最直接的方法是:1)删除上下文绑定2)使JacksonGenericSerializer
抽象并添加一个抽象字段隐式val清单:清单[T]
3)实现类JacksonMyTypeSerializer扩展JacksonGenericSerializer[MyType]{implicit val manifest=implicit[manifest[MyType]}