Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 数据库自动创建->;找不到参数会话的隐式值_Scala_Phantom Dsl - Fatal编程技术网

Scala 数据库自动创建->;找不到参数会话的隐式值

Scala 数据库自动创建->;找不到参数会话的隐式值,scala,phantom-dsl,Scala,Phantom Dsl,我是scala(长期java开发人员)的新手。我试着理解隐式,我想我理解了基本原理,但是我不明白为什么它找不到隐式值session。我试图用尽可能多的信息来描述我的问题 我关注了以下博文: 在我想测试之前,一切都进行得很顺利。获取以下错误: Error:(15, 46) could not find implicit value for parameter session: com.datastax.driver.core.Session Await.result(Database.au

我是scala(长期java开发人员)的新手。我试着理解隐式,我想我理解了基本原理,但是我不明白为什么它找不到隐式值
session
。我试图用尽可能多的信息来描述我的问题

我关注了以下博文:

在我想测试之前,一切都进行得很顺利。获取以下错误:

Error:(15, 46) could not find implicit value for parameter session: com.datastax.driver.core.Session
    Await.result(Database.autocreate().future(), 5.seconds)
                                             ^
Error:(20, 48) could not find implicit value for parameter session: com.datastax.driver.core.Session
    Await.result(Database.autotruncate().future(), 5.seconds)
                                               ^
当我执行以下测试类时:

import org.joda.time.DateTime
import org.scalatest.{BeforeAndAfterAll, FlatSpec}

import scala.concurrent.Await
import scala.concurrent.duration._

class DatabaseTest extends FlatSpec with BeforeAndAfterAll{
  override def beforeAll(): Unit = {
    super.beforeAll()
    Await.result(Database.autocreate().future(), 5.seconds)
  }

  override def afterAll(): Unit = {
    super.afterAll()
    Await.result(Database.autotruncate().future(), 5.seconds)
  }

  "A TwitterMessage" should "be stored in cassandra" in {
    val twitterMessageBefore = TwitterMessage(1L, DateTime.now, "This is a message", "me", "none")

    Database.twitterMessages.store(
      twitterMessageBefore
    )

    val twitterMessageAfter:Option[TwitterMessage] = Await.result(Database.twitterMessages.getById(1L), 5.seconds)

    assert(twitterMessageAfter.isDefined, "No entry was found regarding the id.")

    assert(twitterMessageAfter.get equals twitterMessageBefore)
  }
}
我还复制了我在下面写的其他课程:

TwitterMessages.scala

import com.websudos.phantom.dsl._

import scala.concurrent.Future

case class TwitterMessage (
  id: Long,
  timestamp: DateTime,
  msg: String,
  user: String,
  category: String
)

sealed class TwitterMessages extends CassandraTable[ConcreteTwitterMessages, TwitterMessage]{
  object id extends LongColumn(this) with PartitionKey[Long]
  object timestamp extends DateTimeColumn(this)
  object msg extends StringColumn(this)
  object user extends StringColumn(this)
  object category extends StringColumn(this)

  def fromRow(row: Row): TwitterMessage = {
    TwitterMessage(
      id(row),
      timestamp(row),
      msg(row),
      user(row),
      category(row)
    )
  }
}

abstract class ConcreteTwitterMessages extends TwitterMessages with RootConnector{
  def store(twitterMessage: TwitterMessage): Future[ResultSet] = {
    insert.value(_.id, twitterMessage.id)
      .value(_.timestamp, twitterMessage.timestamp)
    .value(_.msg, twitterMessage.msg)
    .value(_.user, twitterMessage.user)
    .value(_.category, twitterMessage.category)
    .consistencyLevel_=(ConsistencyLevel.ALL)
    .future()
  }

  def getById(id: Long): Future[Option[TwitterMessage]] = {
    select.where(_.id eqs id).one()
  }
}
import com.websudos.phantom.connectors.{ContactPoint, KeySpaceDef}

object Defaults {
  val connector = ContactPoint.local.keySpace("twitter")
}

class Database(val keyspace:KeySpaceDef) extends com.websudos.phantom.db.DatabaseImpl(keyspace){
  object twitterMessages extends ConcreteTwitterMessages with keyspace.Connector
}

object Database extends Database(Defaults.connector)
数据库.scala

import com.websudos.phantom.dsl._

import scala.concurrent.Future

case class TwitterMessage (
  id: Long,
  timestamp: DateTime,
  msg: String,
  user: String,
  category: String
)

sealed class TwitterMessages extends CassandraTable[ConcreteTwitterMessages, TwitterMessage]{
  object id extends LongColumn(this) with PartitionKey[Long]
  object timestamp extends DateTimeColumn(this)
  object msg extends StringColumn(this)
  object user extends StringColumn(this)
  object category extends StringColumn(this)

  def fromRow(row: Row): TwitterMessage = {
    TwitterMessage(
      id(row),
      timestamp(row),
      msg(row),
      user(row),
      category(row)
    )
  }
}

abstract class ConcreteTwitterMessages extends TwitterMessages with RootConnector{
  def store(twitterMessage: TwitterMessage): Future[ResultSet] = {
    insert.value(_.id, twitterMessage.id)
      .value(_.timestamp, twitterMessage.timestamp)
    .value(_.msg, twitterMessage.msg)
    .value(_.user, twitterMessage.user)
    .value(_.category, twitterMessage.category)
    .consistencyLevel_=(ConsistencyLevel.ALL)
    .future()
  }

  def getById(id: Long): Future[Option[TwitterMessage]] = {
    select.where(_.id eqs id).one()
  }
}
import com.websudos.phantom.connectors.{ContactPoint, KeySpaceDef}

object Defaults {
  val connector = ContactPoint.local.keySpace("twitter")
}

class Database(val keyspace:KeySpaceDef) extends com.websudos.phantom.db.DatabaseImpl(keyspace){
  object twitterMessages extends ConcreteTwitterMessages with keyspace.Connector
}

object Database extends Database(Defaults.connector)

为了具体解决您的问题,您所要做的就是将连接器混合到测试套件中。这是我的,因为我忘了用这些信息更新博客帖子

class DatabaseTest extends FlatSpec with BeforeAndAfterAll
  with Defaults.connector.Connector

@JulianLiebl连接器注入
会话
,因此套件无法找到所需的
隐式会话。事实当然更为复杂,但您需要记住的是,您需要在范围内使用
隐式会话
。确认也适用于简单演示对象:
对象幻影扩展默认值。connector.connector{…}