【问题标题】:Play Action Composition - hardcoding parameterized parserPlay Action Composition - 硬编码参数化解析器
【发布时间】:2016-08-09 13:59:15
【问题描述】:

我想创建一个自定义操作,以消除编写此类操作的样板:

Action[MyClass](BodyParsers.parse.json[MyClass]) { req => ...

但是,我不断遇到类定义错误。这是我最成功的尝试:

class JsonAction[A: Reads] extends ActionBuilder[Request] {
  def hardcodedJson[A: Reads](action: Action[A]) = 
    Action.async(BodyParsers.parse.json[A]) { request => action(request) }

  def invokeBlock[A: Reads](request: Request[A], block: (Request[A]) => Future[Result]) = {
    block(request)
  }
  override def composeAction[A: Reads](action: Action[A]) = hardcodedJson(action)
}

但我收到以下错误:method composeAction overrides nothing.

如果我将 composeAction[A: Reads] 更改为 composeAction[A],它会告诉我没有 A 类型的 Json 序列化器。

还有其他方式来定义这个自定义操作吗?

【问题讨论】:

    标签: scala playframework play-json context-bound


    【解决方案1】:

    是的,我试图让它与官方的 ActionBuilder way-of-doing-it 一起使用,但无法让类型对齐。

    这里有一些对我有用的东西:

    object JsonActionHelper {
      def withReads[A](act: Request[A] => Future[Result])(implicit reads:Reads[A]) = 
        Action.async(BodyParsers.parse.json(reads))(act)
    }
    

    在您的控制器中使用(FooJson 是一个包含隐式Reads[Foo] 的object):

    import models.FooJson._
    import JsonActionHelper._
    
    def handleIncomingFoo(fooId:String) = withReads[Foo] { req =>
      val foo:Foo = req.body
      ...
      Ok(...)
    }
    

    【讨论】:

      【解决方案2】:

      ActionBuilder 对于您的用例来说不够通用;你的Reads[T] 无处可传。

      不过,ActionBuilder 并没有什么特别之处。它是apply 和async 工厂方法的集合。您可以使用所需的任何工厂方法定义自己的 Action 类型:

      object JsonAction {
        def apply[A : Reads](request: Request[A] => Result) = Action(BodyParsers.parse.json[A])(request)
      }
      
      // these are equivalent:
      Action[MyClass](BodyParsers.parse.json[MyClass]) { req => ??? }
      JsonAction[MyClass] { req => ??? }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-02
        相关资源
        最近更新 更多