mapInnerRoute不起作用

时间:2015-10-06 12:07:15

标签: scala akka spray akka-http

我试图创建路由,将捕获的异常包装到我的异常中,该异常包含登录用户的用户对象。理想情况下,我更愿意将这些信息放入ContextRequest,以便在ExceptionHandler中使用它,但它是不可变的。

我的结论是,正确的方法是使用this example中描述的mapInnerRoute

def completeWithUserAwareException(user: User) =
  mapInnerRoute { route =>
    ctx =>
      try {
        route(ctx)
      } catch {
        case ex: Throwable =>
          ctx.fail(new ExceptionWithUser(user, 0, ex))
      }
  }

我这样使用

val authenticatedRoutes = myAuthorization { user =>
    completeWithUserAwareException(user) {
    pathPrefix("admin") {
      (get & path("plugins")) {
          complete {
            ""
          }
      }
    }
  }
}

永远不会调用completeWithUserAwareException的内容。我怀疑它与外部路线的动态性有关。

如何实现将用户上下文信息传递给异常处理程序的目标?

1 个答案:

答案 0 :(得分:1)

尝试

def completeWithUserAwareException(user: User) =
  handleExceptions(
    ExceptionHandler {
      case NonFatal(ex) => failWith(new ExceptionWithUser(user, 0, ex))
    })