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