簡體   English   中英

Scala類的最終def this()聲明沒有公共的無參數構造函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM