当前位置:  开发笔记 > 编程语言 > 正文

如何在Play Framework的路由文件中使用导入和隐含?

如何解决《如何在PlayFramework的路由文件中使用导入和隐含?》经验,为你挑选了2个好方法。

什么是对范围routes的文件找implicit好像PathBindable还是QueryStringBindable

对于自定义类型,只需在伴随对象中定义它们就像下面这样简单:

case class Foo(data: String)
object Foo {
  implicit val pathBinder: PathBindable[Foo] = ???
}

但是,对于现有类型,routes由于我们不能import在此处执行任何自定义,因此不清楚在文件中声明隐式的位置.

那么,路由文件的含义范围是什么?



1> colinjwebb..:

这并没有直接回答这个问题,但似乎相关......

您可以routes通过添加到routesImport您的密钥中的自定义导入build.sbt

例如:

import play.PlayImport.PlayKeys._

routesImport += "my.custom.package.Foo._"

该片段是从我刚才写的一篇名为Using Play-Framework的PathBindable的博客文章中借来的



2> 小智..:

我们有一个需要使用的queryStringBindable,并且有类似的情况,我们发现了这个问题,这给了我们一个线索,但colinjwebb的答案已经过时了。

这是我们的示例,它从字符串到Option [LoginContext]。

package controllers

import play.api.mvc.{Action, AnyContent, QueryStringBindable, Request}
...

object BindableLoginContext {

  implicit def queryStringBindable(implicit stringBinder: QueryStringBindable[String]) = new QueryStringBindable[LoginContext] {
    override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, LoginContext]] =
      for {
        loginContextString <- stringBinder.bind(key, params)
      } yield {
        loginContextString match {
          case Right(value) if value.toLowerCase == "web" => Right(LoginContexts.Web)
          case Right(value) if value.toLowerCase == "api" => Right(LoginContexts.Api)
          case _ => Left(s"Unable to bind a loginContext from $key")
        }
      }

    override def unbind(key: String, loginContext: LoginContext): String = stringBinder.unbind(key, loginContext.toString)
  }
}

要使用它,我们需要使用以下导入:

import play.sbt.routes.RoutesKeys

然后像这样将对象添加到项目中

lazy val microservice = Project(appName, file("."))
  .settings(
    RoutesKeys.routesImport += "controllers.BindableLoginContext._"
  )

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有