PlayFramework 2.4 Scala ActionRefiner,带有来自url用法的参数

时间:2016-03-15 08:10:31

标签: 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: Request[AnyContent] =>
      Ok("Ok")
    }

我已经

  

" play.api.mvc.ActionRefiner [play.api.mvc.Request,controllers.actionbuilders.LangRequest]   没有参数"

编译时出现

错误。我该如何使用这个ActionRefiner?在PlayFramework文档https://www.playframework.com/documentation/2.4.x/ScalaActionsComposition中,他们使用Filter,Transformer显示ActionRefiner用法,如下所示:

(UserAction andThen ItemAction(itemId) andThen PermissionCheckAction)

这确实有效。但是如何使用一个ActionRefiner?

1 个答案:

答案 0 :(得分:0)

对不起这是相当古老的,但我遇到了类似的问题,并希望发布解决方案,以便其他人可以找到它。我怀疑这是因为动作链中的第一项应该是一个ActionBuilder,除了其他任何东西。 ActionTransformer不是ActionBuilder的子类型,虽然它可以是ActionBuilder#andThen的参数。