1

Scala 経由で Java Cassandra クライアント Astyanax を使用しようとしていますが、次のコンパイル エラーが発生します。

[error] /massrel/metrics-batcher/src/main/scala/com/massrel/batcher/MetricsWriter.scala:35: type mismatch;
[error]  found   : com.netflix.astyanax.model.ColumnFamily[java.nio.ByteBuffer,java.lang.Long]
[error]  required: com.netflix.astyanax.model.ColumnFamily[java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]],java.lang.Long]
[error] Note: java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]], but Java-defined class ColumnFamily is invariant in type K.
[error] You may wish to investigate a wildcard type such as `_ <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]]`. (SLS 3.2.10)
[error]     m.withRow(CF_M, "foo").incrementCounterColumn(0, 1)
[error]               ^
[error] /massrel/metrics-batcher/src/main/scala/com/massrel/batcher/MetricsWriter.scala:36: type mismatch;
[error]  found   : com.netflix.astyanax.model.ColumnFamily[java.nio.ByteBuffer,java.lang.Long]
[error]  required: com.netflix.astyanax.model.ColumnFamily[java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]],java.lang.Long]
[error] Note: java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]], but Java-defined class ColumnFamily is invariant in type K.
[error] You may wish to investigate a wildcard type such as `_ <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Comparable[_ >: java.lang.String with java.nio.ByteBuffer <: java.lang.Object]]`. (SLS 3.2.10)
[error]     m.withRow(CF_M, "bar").incrementCounterColumn(0, 1)
[error]               ^

問題のコードは次のとおりです。

package com.massrel.batcher

import java.nio.ByteBuffer
import scala.collection.mutable.{Map => MMap}
import com.netflix.astyanax._
import com.netflix.astyanax.impl._
import com.netflix.astyanax.connectionpool._
import com.netflix.astyanax.connectionpool.impl._
import com.netflix.astyanax.thrift._
import com.netflix.astyanax.model._
import com.netflix.astyanax.serializers._

class MetricsWriter {
  val context: AstyanaxContext[Keyspace] = new AstyanaxContext.Builder()
    .forCluster("cluster1")
    .forKeyspace("dev1")
    .withAstyanaxConfiguration(new AstyanaxConfigurationImpl()
        .setDiscoveryType(NodeDiscoveryType.RING_DESCRIBE)
        .setConnectionPoolType(ConnectionPoolType.TOKEN_AWARE)
    )
    .withConnectionPoolConfiguration(new ConnectionPoolConfigurationImpl("connectionpool1")
        .setPort(9160)
        .setMaxConnsPerHost(1)
        .setSeeds("127.0.0.1:9160")
    )
    .withConnectionPoolMonitor(new CountingConnectionPoolMonitor())
    .buildKeyspace(ThriftFamilyFactory.getInstance());
  context.start()

  val keyspace = context.getEntity()
  val CF_M = new ColumnFamily[ByteBuffer, java.lang.Long]("M", ByteBufferSerializer.get(), LongSerializer.get())

  def writeTest() {
    val m = keyspace.prepareMutationBatch()
    m.withRow(CF_M, "foo").incrementCounterColumn(0, 1)
    m.withRow(CF_M, "bar").incrementCounterColumn(0, 1)
    m.execute()
  }
}

この問題を回避するためにコードで何ができますか?

それが役立つ場合は、https ://github.com/Netflix/astyanax で Astyanax コードを表示できます。

4

1 に答える 1

1

からMutationBatch.java

<K, C> ColumnListMutation<C> withRow(ColumnFamily<K, C> columnFamily, K rowKey);

したがって、rowKeyは、の最初の型パラメータと同じ型である必要がありますColumnFamily。あなたはaColumnFamily[ByteBuffer, java.lang.Long]であり、あなたはそれを通過しました。"foo"これは、Stringではなく、ByteBufferです。

于 2012-10-08T22:31:54.150 に答える