在定义路由指令时是否可以使用隐式参数?

时间:2015-12-04 11:07:50

标签: scala akka-http

我有一个指令,定义为

def allowedRoles(roles: UserRole*)(implicit login: Login): Directive0 = ???

但我似乎无法使用它而无需明确地传递login参数

def myRoutes(implicit req: HttpRequest, login: Login) = {
  path("example" / "path") {
    get {
      allowedRoles(Administrator) { // ← fails 
        handleGet
      }
    }
  }
}

如果我尝试编译它,它会因类型不匹配而失败:

[error]  found   : akka.http.scaladsl.server.Route
[error]     (which expands to)  akka.http.scaladsl.server.RequestContext => scala.concurrent.Future[akka.http.scaladsl.server.RouteResult]
[error]  required: com.example.Login
[error]         allowedRoles(Administrator) { handleGet } }

如果我将标记的行更改为allowedRoles(Administrator)(login),那么它可以正常工作,但似乎我不应该这样做,我缺少什么?

1 个答案:

答案 0 :(得分:9)

这是因为通过Scala规则,{ handleGet }被视为allowedRoles的第二个参数列表。要解决此问题,请明确说明它实际上是Directive0.apply

的参数
allowedRoles(Administrator).apply { handleGet }