ActionBuilder将requestBody返回为null

时间:2017-11-20 17:27:05

标签: scala playframework

我正在开发一个带有play框架的scala Web应用程序,我第一次使用过滤器来验证请求但我没有结果然后我尝试使用动作构建器我必须覆盖2个方法这里是我的ActionBuilder对象

object MyJsonAction extends ActionBuilder[Request, Response] with Results {
  def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = {
    println (request.body)// returning null everytime why ?
       block(request)
  }

  override def parser = { // what does this method do, i think the problem started from here :/ ?
    null;

  }

  override protected def executionContext = {

    null;
  }
}

嗯,游戏框架没有太多资源只是简单的例子,并且没有例子简要解释这些方法正在做什么,他们告诉你可以在不告诉你如何的情况下获得请求体!一切很暧昧!我一直坚持使用它3天,我不知道我现在该怎么办。谢谢

2 个答案:

答案 0 :(得分:1)

重要的部分是parser: BodyParser[A]它接收传入的字节并将它们转换为类型A

例如BodyParser[JsValue]将生成JsValue类型的主体。它用于阅读Json。

如果您尝试验证对象,则可能是操作构建器不适合启动。您可以更多关注BodyParsersjson validation

答案 1 :(得分:1)

ActionBuilder是构建Action的对象。 Action合并BodyParser[T],其中T读取请求正文并使用函数Request[T] => Future[Result]构建T来处理ActionBuilder

默认BodyParser以非常简单的方式执行此操作。它将ActionBuilder的结果链接在一起并将其提供给函数。如果你创建了一个自定义ActionBuilder,那么你可以通过在函数调用之前或之后注入自己的逻辑来覆盖这个过程。

如果您自己制作@Singleton class MyJsonAction @Inject() ( bodyParsers: PlayBodyParsers, ec: ExecutionContext) extends ActionBuilder[Request, JsValue] { def invokeBlock[A](request: Request[A], block: (Request[A]) => Future[Result]) = { println(request.body) // DO SOMETHING HERE block(request) } override def parser = bodyParsers.json override protected def executionContext = ec } ,我建议您从以下内容开始作为模板:

class MyController @Inject() (myJsonAction: MyJsonAction) {
  def index = myJsonAction { req: Request[JsValue] => ??? }
}

然后你就可以在你的控制器中使用它:

variable = True