【发布时间】:2015-07-27 10:06:41
【问题描述】:
我正在开发一个代码库,其中调用我的 Spray API 需要同步调用返回 Try 的服务,Spray 需要格式化并通过 HTTP 返回。
我最初的尝试是这样的:
// Assume myService has a run method that returns a Try[Unit]
lazy val myService = new Service()
val routes =
path("api") {
get {
tryToComplete {
myService.run()
}
}
} ~
path("api" / LongNumber) { (num: Long) =>
get {
tryToComplete {
myService.run(num)
}
}
}
def tryToComplete(result: => Try[Unit]): routing.Route = result match {
case Failure(t) => complete(StatusCodes.BadRequest, t.getMessage)
case Success(_) => complete("success")
}
但是这会导致在应用程序启动时调用myService.run()。我不确定为什么调用此方法,因为没有进行 HTTP 调用。
所以我有两个问题:
- 为什么在初始化路由时会调用我的服务?
- 处理这种情况最干净的方法是什么?想象一下,还有一些其他端点遵循类似的模式。所以我需要能够始终如一地处理这个问题。
【问题讨论】:
标签: scala try-catch spray spray-dsl