【发布时间】:2012-09-04 00:09:36
【问题描述】:
在这个问题上坚持了几个小时!非常感谢您的任何见解:)
- Scala 2.9.2
- Astyanax 1.0.6(也尝试过 1.0.5)
- 卡桑德拉 1.1.4
- 使用 CompositeRowKey、CompositeColumnName
- 插入 Cassandra 没问题
- 可以读取一行,ColumnList.size() 返回正确的计数,但是任何访问 ColumnList 的尝试(即迭代、访问迭代 ColumnList、getColumnByIndex()、getColumnByName() 等)都会引发以下异常:
例外:
java.lang.RuntimeException: java.lang.InstantiationException
相关堆栈跟踪:
java.lang.RuntimeException: java.lang.InstantiationException: shops.integration.db.scalaquery.ReportingDao$MetricsLogFileCompositeColumn
at com.netflix.astyanax.serializers.AnnotatedCompositeSerializer.fromByteBuffer(AnnotatedCompositeSerializer.java:136)
at com.netflix.astyanax.serializers.AbstractSerializer.fromBytes(AbstractSerializer.java:40)
at com.netflix.astyanax.thrift.model.ThriftColumnOrSuperColumnListImpl.constructMap(ThriftColumnOrSuperColumnListImpl.java:201)
at com.netflix.astyanax.thrift.model.ThriftColumnOrSuperColumnListImpl.getColumn(ThriftColumnOrSuperColumnListImpl.java:189)
at com.netflix.astyanax.thrift.model.ThriftColumnOrSuperColumnListImpl.getColumnByName(ThriftColumnOrSuperColumnListImpl.java:103)
具体来说:
at java.lang.Class.newInstance0(Class.java:357)
at java.lang.Class.newInstance(Class.java:325)
at com.netflix.astyanax.serializers.AnnotatedCompositeSerializer.createContents(AnnotatedCompositeSerializer.java:167)
相关示例代码:
class TestCompositeColumn(@(Component @field) var logFileId: Long, @(Component @field) var dt: String, @(Component @field) var dk: String) extends Ordered[TestCompositeColumn] {
def this() = this(0l, "", "")
//equals, hashCode, compare all implemented
}
我也在课堂上尝试过这种变体:
class TestCompositeColumn(idIn: Long, key1In: String, key2In: String) extends Ordered[TestCompositeColumn] {
@Component(ordinal = 0) var id: Long = idIn
@Component(ordinal = 1) var key1: String = key1In
@Component(ordinal = 2) var key2: String = key2In
def this() = this(0, null, null)
//equals, hashCode, compare all implemented
}
val TEST_COLUMN_FAMILY = new ColumnFamily[TestRowKey, TestCompositeColumn](
"test_column_family",
new AnnotatedCompositeSerializer[TestRowKey](classOf[TestRowKey]),
new AnnotatedCompositeSerializer[TestCompositeColumn](classOf[TestCompositeColumn]),
BytesArraySerializer.get());
var columnList = keyspace.prepareQuery(TEST_COLUMN_FAMILY)
.getKey(TestRowKey(1l, 2012090100))
.execute().getResult()
// OK - will return 6 for example, also verified via cassandra-cli
println(columnList.size())
// ERROR - will throw exception above. Iterating, or any type of access will also throw same exception
println(columnList.getColumnByIndex(0).getStringValue())
【问题讨论】: