spray.io奇怪的get / delete / detach指令行为

时间:2014-12-30 09:51:47

标签: scala rest spray

我使用喷涂路由指令编写了以下代码:

path("goal" / Segment) { id =>
  get {
    detach(ec) {
      val goal = srv.find(id)
      complete(goal)
    }
  } ~
    delete {
      detach(ec) {
        srv.delete(id)
        complete(OK)
      }
    }
}

问题是执行路径很奇怪。首先,它转到
get-> detach-> srv.find->完成
然后到删除 - >分离 - > srv.delete - >完成
然后它回到
get-> detach-> ...
并在那里完成。问题是srv.delete被执行,这不是一个理想的行为,因为我丢失了数据。任何人都可以解释我这种行为并告诉我如何解决它? 提前谢谢。

2 个答案:

答案 0 :(得分:2)

我有同样的问题,它看起来像是与Spray route DSL相关的东西,我解决了它在路径中添加命令:

(get & path("goal" / Segment)) { id =>
  detach(ec) {
    val goal = srv.find(id)
    complete(goal)
  }
} ~
(delete & path("goal" / Segment)) { id =>
  detach(ec) {
    srv.delete(id)
    complete(OK)
  }
}

很高兴看到另一个解决方案是诚实的,而不是总是复制路径,但到目前为止,这是唯一有效的方法。

答案 1 :(得分:2)

我不明白为什么,但似乎这种修改工作正常:

path("goal" / Segment) { id =>
  get {
    detach(ec) {
      val goal = srv.find(id)
      complete(goal)
    }
  } ~
  delete {
    detach(ec) {
      complete {
        srv.delete(id)  // here
        OK
      }
    }
  }
}

文档here中的示例仅显示分离后仅出现完成/拒绝指令的情况。因此我怀疑它只是用这些进行了测试。