我想异步管理来自Play Framework中表单组件的POST请求。特别是,我想在已经返回Future
的处理程序中使用form参数。
我知道,为了处理POST请求,我必须使用重载来获取输入中的MessagesRequest[AnyContent]
实例,例如:
def action = Action { implicit request: MessagesRequest[AnyContent] =>
Ok(views.html.view( ... ))
}
无论如何,为了管理Future,我必须使用Action.async
方法,但没有发现此方法的任何重载都接受输入MessagesRequest[AnyContent]
的实例。
我已经尝试过使用简单的Request[AnyContent]
实例强制转换处理程序,但是在这种特殊情况下,它没有与Play框架基础结构集成。
从the documentation可以很明显地看出,Action
和Action.async
在本质上都是异步的,并且Action.async
只是启用该功能的辅助工具以非阻塞的方式编写代码,这正是我想要实现的目标。
根据我的理解,只要返回包装在Future
中的非异步结果就足够了,但是有一种方法可以返回Future
并处理{{1 }}来自Play表单实现?
答案 0 :(得分:2)
像这样将响应包装在Future
中
import scala.concurrent.ExecutionContext.Implicits.global
def action = Action.async { implicit request: MessagesRequest[AnyContent] =>
Future {
Ok(views.html.view( ... ))
}
}
答案 1 :(得分:0)
Mario Galic Answer是该问题的正确答案。
仅仅是添加更多细节,我的错误是使用AbstractController
作为控制器的基类,而不是MessagesAbstractController
。
MessagesAbstractController
类实际上将启用方法Action
的以下签名,该方法在MessagesBaseController
特性中定义:
def Action: ActionBuilder[MessagesRequest, AnyContent]
而不是从AbstractController
特性中定义的BaseController
继承的那个:
def Action: ActionBuilder[Request, AnyContent]
这将使定义一个在输入中接收MessagesRequest[AnyContent]
的处理程序成为可能。