Scala 找不到参数分析器的隐式值:play.api.mvc.BodyParser[Any]
我正在迁移到Play 2.6,并具有以下用于工作的控制器功能:Scala 找不到参数分析器的隐式值:play.api.mvc.BodyParser[Any],scala,playframework,Scala,Playframework,我正在迁移到Play 2.6,并具有以下用于工作的控制器功能: object Accounts extends Controller with API { def all = superUser { implicit principal => api { request => models.Account.all } } } 并获
object Accounts extends Controller with API {
def all = superUser {
implicit principal =>
api {
request =>
models.Account.all
}
}
}
并获取以下错误:
[error] could not find implicit value for parameter parser: play.api.mvc.BodyParser[Any]
[error] def all = superUser {
[error] ^
其中:
def superUser[A](f: => Principal => Request[A] => Result)(implicit parser: BodyParser[A]): SecureAction[A] = {
_superUser {
user =>
implicit val principal = data.Principal(user)
Action(parser)(request => f(principal)(request))
}
}
private def _superUser[A](action: String => Action[A]) = {
play.api.mvc.Security.Authenticated(getSuperUser, onUnauthorized)(action)
}
有关api
包装函数的更多信息,请参见相关问题
问题是为什么隐式参数解析器不在范围内?同样,这也可以使用。
超级用户
需要一个a
的主体解析器实例A
在本例中是您要返回的模型
假设models.Account.all
返回List[Account]
。现在为Account
类提供json主体解析器。现在,这个主体解析器需要对Accountreads[Account]
json进行读取
object Accounts extends Controller with API {
def all = superUser { implicit principal =>
api(request => models.Account.all)
} (parse.json[Account])
}
首先,尝试扩展AbstractController、BaseController或InjectedController而不是Controller(不推荐使用) Play 2.6的控制器上没有作为隐式的BodyParser,但您可以通过控制器变量parse访问默认解析器 如果您需要任何T的BodyParser,则需要提供对它的访问 您使用的是2.6之前的哪个版本?我尝试了以下方法:
import com.google.inject.Inject
import com.google.inject.Singleton
@Singleton
class Accounts @Inject() (components: ControllerComponents) extends AbstractController(components) with API {
def all = superUser { implicit principal =>
api(request => models.Account.all)
} (parse.anyContent)
}
现在它编译时没有错误。我还没有测试它,因为我有另一个错误要修复(见上面的链接)
帐户
过去是一个对象
,但现在它是一个单例类
。有人对这个实现的工作有意见吗?这很有用,但后续问题属于意见部分,而不是答案。@SebastianCelestino:我以前使用的是Play 2.0.2。我不确定我是否理解您对BodyParser
controller变量parse
I所说的话,但我将调查这一点以及控制器磨损问题。谢谢