Scala&光滑:需要修复[带可序列化的产品]的类型不匹配

时间:2017-10-13 07:10:29

标签: scala playframework slick

我正在尝试实现一种方法,该方法通过重用基于userID检索单个用户的方法来检索所有用户,但无法确定类型不匹配。你能告诉我如何解决这个问题吗?

UserDAOImpl.scala:

def findAll: Future[Seq[User]] = {
  val dbUsers: Future[Seq[DbUser]] = db.run(users.result)

  dbUsers.map { dbUserSeq =>
    dbUserSeq.map { dbUser => find(UUID.fromString(dbUser.userID)).value.get match {
      case Success(Some(usr: User)) => usr
      case _ => None
    }}
  }
}

我会省略find的定义,因为它工作正常,但这是签名。

def find(userID: UUID): Future[Option[User]] = {

错误讯息:

found   : Seq[Product with Serializable]
required: Seq[models.User]
          dbUserSeq.map { dbUser =>
                        ^

以防万一,用户的定义

private val users = TableQuery[UserTable]

任何建议都将不胜感激。

2 个答案:

答案 0 :(得分:1)

以前的代码实际上有几个问题,下面的代码是我到目前为止提出的解决方案。也许不是最简单的,但它确实有效。

  def findAll: Future[Seq[User]] = {
    db.run(users.result).map { dbUserSeq =>
      dbUserSeq.map { dbUser =>
        val userFut: Future[Option[User]] = find(UUID.fromString(dbUser.userID))
        Await.ready(userFut, Duration.Inf).value.get match {
          case Success(Some(usr: User)) => usr
          case _ => throw new RuntimeException
        }
      }
    }
  }

答案 1 :(得分:1)

非阻塞方法:

def findAll: Future[Seq[User]] = {
  db.run(users.result)
    .map(dbUserSeq =>
      Future.sequence(dbUserSeq.map(dbUser => find(UUID.fromString(dbUser.userID))))
    )
    .flatMap(userFutSeq => // userFutSeq is a Future[Seq[Option[User]]]
      userFutSeq.map(userSeq => userSeq.collect { case Some(u) => u })
    )
}

上面的代码收集了找到的用户并忽略了其余用户。

除测试目的外,请避免使用Await。使用期货时,请保持在Future

的范围内
相关问题