Scala & Slick:需要修复与 [Product with Serializable] 类型不匹配的问题

Scala & Slick: type mismatch with [Product with Serializable] needs to be fixed

我正在尝试通过重复使用基于 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]

如有任何建议,我们将不胜感激。

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

  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
        }
      }
    }
  }

非阻塞方法:

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。使用 futures 时,请保持在 Future.

的上下文中