ScyllaDB Scala驱动Phantom store方法编译及运行时错误排查
问题解决:ScyllaDB Phantom DSL 编译及运行时异常处理
问题描述
跟随ScyllaDB官方Scala开发指南编写代码,使用sbt 1.2.8时遇到两个问题:
- 编译报错:
value future is not a member of com.outworkers.phantom.builder.query.InsertQuery.Default[db.cql.Mutants,models.Mutant] - 添加
import com.outworkers.phantom.dsl._后编译通过,但运行时抛出:java.lang.ClassCastException: Cannot cast scala.concurrent.impl.Promise$Transformation to com.outworkers.phantom.ResultSet
解决方案
1. 编译错误解决
编译错误是因为缺少Phantom DSL的核心导入,必须添加:
import com.outworkers.phantom.dsl._
这个导入会为InsertQuery添加future()等扩展方法,解决编译时找不到方法的问题。
2. 运行时类型转换异常解决
(1)确保版本兼容性
sbt 1.2.8通常搭配Scala 2.12.x,需要选用对应版本的Phantom DSL依赖。在build.sbt中指定兼容版本:
libraryDependencies += "com.outworkers" %% "phantom-dsl" % "2.16.0"
注:版本号需匹配你的Scala版本,2.16.0支持Scala 2.12.x,可根据实际情况调整
(2)修正类型声明
代码中Future[ResultSet]的ResultSet类型错误,应该使用Datastax驱动的ResultSet而非Phantom的ResultSet。添加正确的导入:
import com.datastax.driver.core.ResultSet import scala.concurrent.Future
(3)修正代码拼写错误
Mutants表类中的字段adress拼写错误,改为address,与case class的字段名保持一致:
object address extends StringColumn
(4)补全缺失的实例定义
MutantInsert类中的mu变量未定义,需要创建一个有效的Mutant实例:
val mu = Mutant("Charles", "Xavier", "1407 Graymalkin Lane", "/xavier.jpg")
(5)确认数据库连接配置
确保ContactPoints中的节点地址、端口正确,目标keyspacecatalog已在ScyllaDB中创建。
修正后的完整代码示例
import com.datastax.driver.core.ResultSet import com.outworkers.phantom.dsl._ import scala.concurrent.Future case class Mutant( firstName: String, lastName: String, address: String, pictureLocation: String ) abstract class Mutants extends Table[Mutants,Mutant] { override def tableName: String = "mutant_data" object firstName extends StringColumn with PartitionKey { override def name = "first_name" } object lastName extends StringColumn with PartitionKey { override def name = "last_name" } object address extends StringColumn object pictureLocation extends StringColumn { override def name = "picture_location" } } class MutantsDatabase(override val connector: CassandraConnection) extends Database[MutantsDatabase](connector) { object mutants extends Mutants with Connector } class MutantInsert { val connection: CassandraConnection = ContactPoints(List("scylla-node1:9042", "scylla-node2:9042", "scylla-node3:9042")) .keySpace("catalog") val db = new MutantsDatabase(connection) import db.{session, space} val mu = Mutant("Charles", "Xavier", "1407 Graymalkin Lane", "/xavier.jpg") val insertionResult: Future[ResultSet] = db.mutants.store(mu).future() }
内容的提问来源于stack exchange,提问作者sarah w
相关产品推荐
相关产品推荐

