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

标签 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")
      }

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

最佳答案

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

可能你有和我一样的场景。
最初尝试实现类似于 https://www.playframework.com/documentation/2.6.x/ScalaActionsComposition#Putting-it-all-together 中示例的代码

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

所以,而不是拥有 userAction andThen ItemAction(itemId) andThen PermissionCheckAction , 我只需要 ItemAction(itemId)
我遇到了与您试图天真地删除其他 2 个 Action 功能相同的错误。
我认为问题在于指南中的 userAction 指定/定义请求将使用的正文解析器。

通过删除这部分,您的请求不知道正文解析器的类型,因此它不知道请求 [A] 的 [A],因此提示类型

我的修复:使用 Action 类(而不仅仅是函数),它可以将主体解析器传递给构造函数

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

我的 Controller 有
def get(leagueId: String) = (new LeagueAction(parse.default, leagueId)).async { implicit request => 
     Future(Ok(Json.toJson(request.league)))
}

我无法使用 Action 组合函数而不是扩展 ActionBuilder 的类来避免 OP 的错误。

关于scala - 在 ActionRefiner 之后,Play Framework 2.4 Scala 缺少 Action 中隐式请求的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35956630/

相关文章:

scala - 不使用 val 存储值

scala - 递归求和函数,如何限制总和?

html - 使用公共(public)文件夹中的图像

scala - 如何使用条件为每个组生成新的列值

java - 使用内存数据库 PlayFramework 执行 JUnit 测试

java - 玩! - GET/user/{id} 无密码

java - ProcessBuilder 在 Mac 上给出 "No such file or directory"而 Runtime().exec() 工作正常

scala - 使用 "in new WithApplication"时如何在 specs2 中进行设置/拆卸

scala - 在 Scala 中对 HashMap 进行子类化,解决类型删除问题

java - 在 Yodlee 上构建的最佳堆栈是什么