加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 获取用户并填写所有权限

发布时间:2020-12-16 19:14:26 所属栏目:安全 来源:网络整理
导读:我是 Scala的新手,甚至我想用 Java实现的过于简单,我对Scala感到困惑. 我想要的是获取一个用户,然后使用另一个查询并根据他的角色和他的个人权限填写他的权限. 直到知道我有以下代码: /*** Finds a user by its loginInfo.** @param loginInfo The loginInf
我是 Scala的新手,甚至我想用 Java实现的过于简单,我对Scala感到困惑.

我想要的是获取一个用户,然后使用另一个查询并根据他的角色和他的个人权限填写他的权限.

直到知道我有以下代码:

/**
* Finds a user by its loginInfo.
*
* @param loginInfo The loginInfo of the user to find.
* @return The found user or None if no user for the given login info could be found.
*/
def find(loginInfo: LoginInfo): Future[Option[models.admin.User]] = {

val userQuery = for {
  dbLoginInfo <- loginInfoQuery(loginInfo)
  dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id)
  dbUser <- User.filter(_.userid === dbUserLoginInfo.userid)
  user <- dbUser match {
    case u =>
      val permissionQuery = for {
        dbUserPermission <- Userpermission.filter(_.userid === u.userid)
        dbPermission <- Permission.filter(_.id === dbUserPermission.permissionid)
      } yield dbPermission

      val rolePermissionQuery = for {
        dbUserRole <- Userrole.filter(_.userid === u.userid)
        dbRole <- Role.filter(_.id === dbUserRole.roleid)
        dbRolePermission <- Rolepermission.filter(_.roleid === dbRole.id)
        dbPermission <- Permission.filter(_.id === dbRolePermission.permissionid)
      } yield dbPermission

      val unionPermissionQuery = permissionQuery union rolePermissionQuery

      db.run(unionPermissionQuery.result).map(_.map(_.name).toList).map { permission =>

        models.admin.User(
          UUID.fromString(u.userid.toString),u.firstname.toString,u.lastname.toString,u.jobtitle.toString,loginInfo,u.email.toString,false,Some(permission),false)
      }
    case None => None
  }
} yield user

db.run(userQuery.result.headOption)

}

我收到以下错误:

pattern type is incompatible with expected type;
[error]  found   : None.type
[error]  required: UserDAOImpl.this.User
[error]         case None => None
[error]              ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:36: value map is not a member of Object
[error]       user <- dbUser match {
[error]                      ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:34: type mismatch;
[error]  found   : UserDAOImpl.this.Userlogininfo => slick.lifted.Query[Nothing,Nothing,Seq]
[error]  required: UserDAOImpl.this.Userlogininfo => slick.lifted.Query[Nothing,T,Seq]
[error]       dbUserLoginInfo <- Userlogininfo.filter(_.logininfoid === dbLoginInfo.id)
[error]                       ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:33: type mismatch;
[error]  found   : UserDAOImpl.this.Logininfo => slick.lifted.Query[Nothing,Seq]
[error]  required: UserDAOImpl.this.Logininfo => slick.lifted.Query[Nothing,Seq]
[error]       dbLoginInfo <- loginInfoQuery(loginInfo)
[error]                   ^
[error] play/modules/admin/app/models/daos/impl/UserDAOImpl.scala:69: value headOption is not a member of UserDAOImpl.this.driver.DriverAction[Seq[Nothing],UserDAOImpl.this.driver.api.NoStream,slick.dbio.Effect.Read]
[error]     db.run(userQuery.result.headOption)
[error]                             ^
[error] 5 errors found

解决方法

每当你使用for-comprehension with yield时,你必须明白你是在使用某种“包裹”值(monad).它可以是Future,List,Option或其他任何monadic.

所以模式有点像这样:

for {
  someValue <- someWrappedValue()
  someOtherValue <- someWrappedOtherValue(someValue)
} yield someOtherValue

如果您正在使用Future,那么您可以使用以下规则:

>< - 右边的所有东西都必须是未来
>< - 左边的所有内容都是“unwrapped”值
>整个理解的价值将是未来包含的收益

列表,选项等的规则是相同的.但是你不能在相同的理解中混合和匹配.

其中一个错误提示您的匹配语句的结果是Object类型,这意味着scala无法找出匹配中所有情况的公共类型.你希望所有的案例都能产生一个未来(因为这就是我们在这个理解中所使用的).

我猜,你需要更换:

case None => None

有:

case None => Future.successful(None)

但如果没有更多信息,很难确定.

关于它在Java中更简单:不完全是.使它更复杂的不是语言,而是很多方法都是异步的.如果你要在scala中同步执行它,那就像java一样简单,如果不是更多的话.但是每次等待结果时都会阻塞一个线程,这就是java的情况(假设是同步调用).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读