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

时间:2018-07-27 18:11:00

标签: scala playframework

我正在迁移到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包装函数是什么的更多信息,请参见相关问题required: play.api.mvc.Request[?] => play.api.mvc.Result

问题是为什么隐式参数解析器不在范围内?再次,这曾经起作用。

3 个答案:

答案 0 :(得分:0)

superUser期望A的主体解析器实例。在这种情况下,A是您要返回的模型。

让我们说models.Account.all返回List[Account]。现在为Account类提供json主体解析器。现在,此正文解析器需要对帐户Reads[Account]

进行JSON读取
object Accounts extends Controller with API {

    def all = superUser { implicit principal =>
       api(request => models.Account.all)
    } (parse.json[Account])
}

答案 1 :(得分:0)

首先,尝试扩展AbstractController,BaseController或InjectedController而不是Controller(已弃用)。

Play 2.6的控制器上没有隐含BodyParsers,但是您可以通过控制器变量 parse 访问默认解析器。

如果您需要任何T的BodyParser,则需要提供对其的访问。

您使用的是2.6之前的版本?

答案 2 :(得分:0)

我尝试了以下操作:

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)
}

现在可以编译而不会出现错误。我还没有测试它,因为我要修复另一个错误(请参见上面的链接)。

Accounts曾经是object,但现在是Singleton class。有人对此实施方式有意见吗?