Какова область действия файла routes, чтобы найти implicit такие как PathBindable или QueryStringBindable?

Для настраиваемых типов просто определить их в сопутствующем объекте, как показано ниже:

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

Однако для существующих типов неясно, где объявлять неявное обнаружение с помощью файла routes, поскольку здесь мы не можем делать никаких настраиваемых import.

Итак, Каковы возможные последствия для файла маршрутов?

7
Daniel Shin 31 Дек 2015 в 10:53

2 ответа

Лучший ответ

Это не дает прямого ответа на вопрос, но кажется актуальным ...

Вы можете включить собственный импорт в файл routes, добавив к ключу routesImport в своем build.sbt

Например:

import play.PlayImport.PlayKeys._

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

Этот фрагмент заимствован из сообщения в блоге, которое я недавно написал под названием Использование PathBindable в Play-Framework

11
colinjwebb 31 Дек 2015 в 08:39

У нас был 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._"
  )
7
Dominic Clifton 13 Янв 2017 в 14:17