Scala中的DSE 5.0自定义编解码器 - Intellij无法编译

问题描述 投票:0回答:2

我正在尝试编写一个自定义编解码器,将timestamp类型的Cassandra列转换为org.joda.time.DateTime

我正在用sbt版本0.13.13构建我的项目。

我写了一个测试序列化和反序列化DateTime对象。当我使用sbt "test:testOnly *DateTimeCodecTest"通过命令行运行测试时,项目构建并且测试通过。

但是,如果我尝试在Intellij中构建项目,我收到以下错误:

Error:(17, 22) overloaded method constructor TypeCodec with alternatives:
  (x$1: com.datastax.driver.core.DataType,x$2: shade.com.datastax.spark.connector.google.common.reflect.TypeToken[org.joda.time.DateTime])com.datastax.driver.core.TypeCodec[org.joda.time.DateTime] <and>
  (x$1: com.datastax.driver.core.DataType,x$2: Class[org.joda.time.DateTime])com.datastax.driver.core.TypeCodec[org.joda.time.DateTime]
 cannot be applied to (com.datastax.driver.core.DataType, com.google.common.reflect.TypeToken[org.joda.time.DateTime])
object DateTimeCodec extends TypeCodec[DateTime](DataType.timestamp(), TypeToken.of(classOf[DateTime]).wrap()) {

这是编解码器:

import java.nio.ByteBuffer

import com.datastax.driver.core.exceptions.InvalidTypeException
import com.datastax.driver.core.{ DataType, ProtocolVersion, TypeCodec }
import com.google.common.reflect.TypeToken
import org.joda.time.{ DateTime, DateTimeZone }

/**
 * Provides serialization between Cassandra types and org.joda.time.DateTime
 *
 * Reference for writing custom codecs in Scala:
 *   https://www.datastax.com/dev/blog/writing-scala-codecs-for-the-java-driver
 */
object DateTimeCodec extends TypeCodec[DateTime](DataType.timestamp(), TypeToken.of(classOf[DateTime]).wrap()) {

  override def serialize(value: DateTime, protocolVersion: ProtocolVersion): ByteBuffer = {
    if (value == null) return null

    val millis: Long = value.getMillis

    TypeCodec.bigint().serializeNoBoxing(millis, protocolVersion)
  }

  override def deserialize(bytes: ByteBuffer, protocolVersion: ProtocolVersion): DateTime = {
    val millis: Long = TypeCodec.bigint().deserializeNoBoxing(bytes, protocolVersion)
    new DateTime(millis).withZone(DateTimeZone.UTC)
  }

  // Do we need a formatter?
  override def format(value: DateTime): String = value.getMillis.toString

  // Do we need a formatter?
  override def parse(value: String): DateTime = {
    try {
      if (value == null ||
        value.isEmpty ||
        value.equalsIgnoreCase("NULL")) throw new Exception("Cannot produce a DateTime object from empty value")
      // Do we need a formatter?
      else new DateTime(value)
    } catch {
      // TODO: Determine the more specific exception that would be thrown in this case
      case e: Exception =>
        throw new InvalidTypeException(s"""Cannot parse DateTime from "$value"""", e)
    }
  }

}

这是测试:

import com.datastax.driver.core.ProtocolVersion
import org.joda.time.{ DateTime, DateTimeZone }
import org.scalatest.FunSpec

class DateTimeCodecTest extends FunSpec {

  describe("Serialization") {
    it("should serialize between Cassandra types and org.joda.time.DateTime") {
      val now = new DateTime().withZone(DateTimeZone.UTC)

      val result = DateTimeCodec.deserialize(
        // TODO: Verify correct ProtocolVersion for DSE 5.0
        DateTimeCodec.serialize(now, ProtocolVersion.V4), ProtocolVersion.V4
      )

      assertResult(now)(result)
    }
  }
}

我广泛使用Intellij中的调试器以及使用一些热键快速运行单个测试的能力。失去在IDE中编译的能力几乎与失去编译能力一样糟糕。任何帮助将不胜感激,如果有人需要,我非常乐意提供有关我的项目//环境的任何其他信息。

编辑,更新:如果我提供com.google.common.reflect.TypeToken的实例而不是shade.com.datastax.spark.connector.google.common.reflect.TypeToken,则项目在IntelliJ中编译。

但是,这打破了sbt内的构建。

scala intellij-idea cassandra datastax-enterprise
2个回答
0
投票

您必须为DateTimeCodec创建默认构造函数。


0
投票

我解决了这个问题。

问题源于类路径上spark-cassandra-connector的冲突版本。依赖项的着色和非阴影版本都在类路径上,删除着色依赖项解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.