Play Framework 2.4 Scala在ActionRefiner之后的Action中隐式请求缺少参数类型

时间:2016-03-12 10:43:44

标签: scala playframework

我已经让ActionRefiner从url中的参数中读取当前请求的语言:

class LangRequest[A](val lang: Lang, request: Request[A]) extends WrappedRequest[A](request)

  def LangAction(lang: String) = new ActionRefiner[Request, LangRequest] {
    def refine[A](input: Request[A]) = Future.successful {
      val availLangs: List[String] = Play.current.configuration.getStringList("play.i18n.langs").get.toList
      if (!availLangs.contains(lang))
        Left {
          input.acceptLanguages.head match {
            case Lang(value, _) if availLangs.contains(value) => Redirect(controllers.routes.Application.index(value))
            case _ => Redirect(controllers.routes.Application.index(availLangs.head))
          }
        }
      else Right {
        new LangRequest(Lang(lang), input)
      }
    }
  }

并试着像这样使用它:

  def login(lng: String) =
      LangAction(lng) {
        implicit request =>
        Ok("Ok")
      }

在这里,我得到了这个"缺少参数类型"隐式请求的错误 我做错了什么? 提前致谢

1 个答案:

答案 0 :(得分:0)

注意:我是Play / Scala的新手。可能有一个更简单的解决方案。

可能您和我有相同的情况。 最初尝试实现类似于https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Putting-it-all-together

中的示例的代码

困难在于实施行动链要比将它们“整合在一起”短。例如,我只需要根据ID来优化操作,但不需要任何身份验证。

因此,我只需要spawn do Kemal.run end spawn do # constant computation/loop with no IO some_func end Fiber.yield # or sleep

,而不是拥有userAction andThen ItemAction(itemId) andThen PermissionCheckAction

当您尝试幼稚地删除其他2个动作功能时,我遇到了相同的错误。 我认为问题在于指南中的userAction指定/定义了请求将使用的主体解析器。

通过删除此部分,您的请求不知道主体解析器的类型,因此不知道请求[A]的[A],因此抱怨类型

我的修正:使用一个动作类(而不只是函数),该动作类可以将身体解析器传递到构造函数中

ItemAction(itemId)

我的控制器有

class LeagueRequest[A](val league: League, request: Request[A]) extends WrappedRequest[A](request)

class LeagueAction(val parser: BodyParser[AnyContent], leagueId: String)(implicit val ec: ExecutionContext) extends ActionBuilder[LeagueRequest, AnyContent] with ActionRefiner[Request, LeagueRequest]{
  def executionContext = ec
  override def refine[A](input: Request[A]) = Future.successful {
    inTransaction(
      (for {
        leagueIdLong <- IdParser.parseLongId(leagueId, "league")
        league <- AppDB.leagueTable.lookup(leagueIdLong).toRight(NotFound(f"League id $leagueId does not exist"))
        out <- Right(new LeagueRequest(league, input))
      } yield out)
    )
  }
}

我无法使用动作组合功能来避免OP的错误,而不是使用扩展了ActionBuilder的类。