我已经让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?
答案 0 :(得分:0)
对不起这是相当古老的,但我遇到了类似的问题,并希望发布解决方案,以便其他人可以找到它。我怀疑这是因为动作链中的第一项应该是一个ActionBuilder,除了其他任何东西。 ActionTransformer不是ActionBuilder的子类型,虽然它可以是ActionBuilder#andThen的参数。