定义路由指令时是否可以使用隐式参数?
Is it possible to use implicit parameters when defining routing directives?
我有一个指令,定义如下
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)
那么它就可以工作,但似乎我不需要这样做,我错过了什么?
发生这种情况是因为根据 Scala 规则,{ handleGet }
被视为 allowedRoles
的第二个参数列表。要解决此问题,请明确它实际上是 Directive0.apply
:
的参数
allowedRoles(Administrator).apply { handleGet }
我有一个指令,定义如下
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)
那么它就可以工作,但似乎我不需要这样做,我错过了什么?
发生这种情况是因为根据 Scala 规则,{ handleGet }
被视为 allowedRoles
的第二个参数列表。要解决此问题,请明确它实际上是 Directive0.apply
:
allowedRoles(Administrator).apply { handleGet }