【问题标题】:spray.io strange get/delete/detach directives behaviorspray.io 奇怪的获取/删除/分离指令行为
【发布时间】:2014-12-30 09:51:47
【问题描述】:

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

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->complete
然后
删除 -> 分离 -> srv.delete -> 完成
然后它回到
get->detach->...
并在那里完成。问题是执行了 srv.delete,这不是所需的行为,因为我丢失了数据。谁能解释我这种行为并告诉我如何解决它? 提前致谢。

【问题讨论】:

  • 我也遇到过类似的问题,因为路线没有充分隔离,所以后来的部分正在评估。但是delete 指令应该防止这种情况。没有detaches 也会发生同样的事情吗?

标签: scala rest spray


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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)
      }
    }
    

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

    【讨论】:

    • 是的,这个工作正常,但我不喜欢在这里重复。我想我会坚持上面的解决方案,仍然感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    相关资源
    最近更新 更多