Scala 找不到参数分析器的隐式值:play.api.mvc.BodyParser[Any]

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 } } } 并获

我正在迁移到Play 2.6,并具有以下用于工作的控制器功能:

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主体解析器。现在,这个主体解析器需要对Account
reads[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所说的话,但我将调查这一点以及控制器磨损问题。谢谢