【问题标题】:Scala Play 2.5 Turning an Action into A ResultScala Play 2.5 将动作转化为结果
【发布时间】:2016-11-15 02:39:42
【问题描述】:

在 Play scala 项目中,我在 Controller 中返回一个对象,其类型为:

play.api.mvc.Action[play.api.libs.json.JsValue 然而,play 抱怨它期待play.api.mvc.Result。根据文档,Action 是一个处理请求并生成结果的函数。

def myController = mySpecialFunction.asyc(prase.tolerantJson) { implicit request => {
        for {
            ... do some stuff ...
        } yield {
            myFunction()
        }
    }
}

在这种情况下,myFunction 的返回类型为 play.api.mvc.Action[play.api.libs.json.JsValue

我想返回一个结果,不知道如何正确调用这个函数

【问题讨论】:

  • 通常,操作是您定义为控制器中的顶级函数的内容。 Play 将调用向它传递请求并期望您返回结果的操作。为什么你有一个变量myController?通常,您有一个代表您的控制器的类,然后是该类中代表操作的一些方法。如果您只想让代码按原样工作,则必须将请求应用于myFunction——但是正如我所说,这看起来很奇怪。
  • 如果您可以展示myFunction 在高级别上所做的事情,可能会为您提供更多帮助。正如您自己所说的那样,您的 Action 的设计并没有达到应有的水平。另外,请注意Action.async 要求您返回Future[Result] 而不仅仅是Result

标签: scala playframework playframework-2.0


【解决方案1】:

您的Action.async 块需要一个从requestFuture[Result] 的函数。

现在,您的 myFunction() 位于 yield 块内,返回 JsValue 作为返回类型。如果你的 for comprehension 是在 Futures 上,那么 for-comprehension 的输出将变为 Future[JsValue]。但是 play 需要 Future[Result]。将您的结果转换为Future[Result]。所以你的最终输出类型应该是Future[Result]

例如

Action.async { req =>
  val resultFuture = 
    for {
      _ <- getUsersFuture
      _ <- doSomethingFuture
    } yield (myFunction)

  resultFuture.map { json => Ok(json) }
}

【讨论】:

  • yield内部myFunction()的返回值为Action[JsValue],而不仅仅是JsValue
  • 我认为这是一个整体设计问题。
【解决方案2】:

如果你想按原样解决问题,你可以将请求传递给myFunction()的结果:

def myController = mySpecialFunction.asyc(prase.tolerantJson) { implicit request => {
        for {
            ... do some stuff ...
        } yield {
            myFunction()(request)
        }
    }
}

这是可行的,因为有一个方法 Action#apply 将使用 request 实例调用并返回 Future[Result]

apply 方法的文档:https://www.playframework.com/documentation/2.5.x/api/scala/index.html#play.api.mvc.Action

【讨论】:

    猜你喜欢
    • 2019-02-25
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多