【问题标题】:could not find implicit value for parameter parser: play.api.mvc.BodyParser[Any]找不到参数解析器的隐式值:play.api.mvc.BodyParser[Any]
【发布时间】:2018-07-27 18:10:59
【问题描述】:

我正在迁移到 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)
}

请参阅相关问题required: play.api.mvc.Request[?] => play.api.mvc.Result,了解有关api 包装函数是什么的更多信息。

问题是为什么隐式参数解析器不在范围内?同样,这曾经有效。

【问题讨论】:

    标签: scala playframework


    【解决方案1】:

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

    假设models.Account.all 返回List[Account]。现在为 Account 类提供 json 正文解析器。现在这个正文解析器需要 json 读取 Account Reads[Account]

    object Accounts extends Controller with API {
    
        def all = superUser { implicit principal =>
           api(request => models.Account.all)
        } (parse.json[Account])
    }
    

    【讨论】:

      【解决方案2】:

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

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

      如果您需要任何 T 的 BodyParser,您需要提供对它的访问权限。

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

      【讨论】:

      • 这很有用,但后续问题属于 cmets 部分,不作为答案。
      • @SebastianCelestino:我之前使用的是 Play 2.0.2。我不确定我是否理解您对BodyParser 控制器变量parse 的看法,但我会调查该问题以及已被贬低的控制器问题。谢谢。
      【解决方案3】:

      我尝试了以下方法:

      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。有人对这个实现的工作有意见吗?

      【讨论】:

        猜你喜欢
        • 2016-02-08
        • 2021-08-29
        • 2017-02-02
        • 2016-01-17
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 2011-10-17
        • 2016-03-31
        相关资源
        最近更新 更多