Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 播放动作合成-硬编码参数化解析器_Scala_Playframework_Play Json_Context Bound - Fatal编程技术网

Scala 播放动作合成-硬编码参数化解析器

Scala 播放动作合成-硬编码参数化解析器,scala,playframework,play-json,context-bound,Scala,Playframework,Play Json,Context Bound,我想创建一个自定义操作,它删除了编写操作的样板文件,如下所示: Action[MyClass](BodyParsers.parse.json[MyClass]) { req => ... 但是,我一直遇到类定义错误。以下是我最成功的尝试: class JsonAction[A: Reads] extends ActionBuilder[Request] { def hardcodedJson[A: Reads](action: Action[A]) = Action.asy

我想创建一个自定义操作,它删除了编写操作的样板文件,如下所示:

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)
}
但是我得到了以下错误:
方法composeAction不覆盖任何内容。

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


是否有其他方法来定义此自定义操作?

是的,我尝试使用官方的
ActionBuilder
方法来定义此自定义操作,但无法使类型对齐

不过,这里有一些东西对我很有用:

object JsonActionHelper {
  def withReads[A](act: Request[A] => Future[Result])(implicit reads:Reads[A]) = 
    Action.async(BodyParsers.parse.json(reads))(act)
}
控制器中的用法(
FooJson
是一个包含隐式
Reads[Foo]
对象):


是的,我试图用官方的
ActionBuilder
方法来实现这一点,但就是无法让类型对齐

不过,这里有一些东西对我很有用:

object JsonActionHelper {
  def withReads[A](act: Request[A] => Future[Result])(implicit reads:Reads[A]) = 
    Action.async(BodyParsers.parse.json(reads))(act)
}
控制器中的用法(
FooJson
是一个包含隐式
Reads[Foo]
对象):


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

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

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 => ??? }

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

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

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 => ??? }