处理服务返回在Spray中返回Try值

时间:2015-05-15 13:01:42

标签: scala try-catch spray spray-dsl

我正在开发一个代码库,调用我的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调用。

所以我有两个问题:

  1. 为什么我的服务被称为初始化路线的一部分?
  2. 处理此案件的最简洁方法是什么?想象一下,在类似模式之后还有一些其他终点。所以我需要能够始终如一地处理这个问题。

2 个答案:

答案 0 :(得分:0)

即使您将结果参数作为名称调用,它也会立即进行评估

result match {

为了不进行评估,它必须在完整的范围内,即你的代码应该看起来像(没有试图编译它):

def tryToComplete(result: => Try[Unit]): routing.Route = complete {
result match {
  case Failure(t) => StatusCodes.BadRequest, t.getMessage
  case Success(_) => "success"
}
}

答案 1 :(得分:0)

我解决这个问题的方法是做以下事情:

article