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,那么您可以使用以下规则: >< - 右边的所有东西都必须是未来 列表,选项等的规则是相同的.但是你不能在相同的理解中混合和匹配. 其中一个错误提示您的匹配语句的结果是Object类型,这意味着scala无法找出匹配中所有情况的公共类型.你希望所有的案例都能产生一个未来(因为这就是我们在这个理解中所使用的). 我猜,你需要更换: case None => None 有: case None => Future.successful(None) 但如果没有更多信息,很难确定. 关于它在Java中更简单:不完全是.使它更复杂的不是语言,而是很多方法都是异步的.如果你要在scala中同步执行它,那就像java一样简单,如果不是更多的话.但是每次等待结果时都会阻塞一个线程,这就是java的情况(假设是同步调用). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |