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
.
的上下文中
我正在尝试通过重复使用基于 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
.