QueryStringBinder для List [String]

Используя Play 2.0.1 я определил следующий маршрут:

<code>GET  /demo/list controllers.Demos.listDemos(page: Int ?= 0, orderBy: Int ?= 1, nameFilter: String ?= "", versionFilter: Long ?= -1, tagFilter: List[String] ?= Nil)
</code>

Но я получаю эту ошибку при компиляции:

<code>No QueryString binder found for type List[String]. Try to implement an implicit QueryStringBindable for this type.
</code>

Я нашел код из Play 2.1-RC (еще не выпущен официально), который решит проблему:

<code>/**
* QueryString binder for List
*/
  implicit def bindableList[T: QueryStringBindable] = new QueryStringBindable[List[T]] {
    def bind(key: String, params: Map[String, Seq[String]]) = Some(Right(bindList[T](key, params)))
    def unbind(key: String, values: List[T]) = unbindList(key, values)
  }

  /**
* QueryString binder for java.util.List
*/
  implicit def bindableJavaList[T: QueryStringBindable] = new QueryStringBindable[java.util.List[T]] {
    def bind(key: String, params: Map[String, Seq[String]]) = Some(Right(bindList[T](key, params).asJava))
    def unbind(key: String, values: java.util.List[T]) = unbindList(key, values.asScala)
  }

  private def bindList[T: QueryStringBindable](key: String, params: Map[String, Seq[String]]): List[T] = {
    for {
      values <- params.get(key).toList
      rawValue <- values
      bound <- implicitly[QueryStringBindable[T]].bind(key, Map(key -> Seq(rawValue)))
      value <- bound.right.toOption
    } yield value
  }

  private def unbindList[T: QueryStringBindable](key: String, values: Iterable[T]): String = {
    (for (value <- values) yield {
      implicitly[QueryStringBindable[T]].unbind(key, value)
    }).mkString("&")
  }
</code>

Но после нескольких часов попыток, Play все еще не находит код. Я пытался использовать пользовательский объект и неявные преобразования этого объекта, но он все еще не работает.

Как я могу заставить Play выполнять неявное преобразование?

Обновит

Я хочу по возможности избегать 2.1-SNAPSHOT, так как я обеспокоен его стабильностью, но я буду использовать его, если нет другого пути. Я пробовал решение из 4e6, но оно не сработало:

<code>[warn]  ::::::::::::::::::::::::::::::::::::::::::::::                                 
[warn]  ::          UNRESOLVED DEPENDENCIES         ::
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
[warn]  :: org.slf4j#slf4j-api;1.6.1: configuration not found in org.slf4j#slf4j-api;1.6.1: 'compile'. It was required from org.hibernate#hibernate-validator;4.2.0.Final compile
[warn]  :: commons-codec#commons-codec;1.4: configuration not found in commons-codec#commons-codec;1.4: 'compile'. It was required from org.apache.httpcomponents#httpclient;4.1.2 compile
[warn]  ::::::::::::::::::::::::::::::::::::::::::::::
</code>

Мой плагин sbt содержит это:

<code>// Comment to get more information during initialization
logLevel := Level.Warn

// The Typesafe repository
resolvers ++= Seq(
  Resolver.url("Typesafe Ivy Snapshots", url("http://repo.typesafe.com/typesafe/ivy-snapshots/"))(Resolver.ivyStylePatterns),
  "Typesafe Releases" at "http://repo.typesafe.com/typesafe/releases/",
  "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/",
  "DefaultMavenRepository" at "http://repo1.maven.org/maven2/",
  "JavaNet1Repository" at "http://download.java.net/maven/1/")

// Use the Play sbt plugin for Play projects
addSbtPlugin("play" % "sbt-plugin" % "2.1-SNAPSHOT")
</code>
 4e605 мая 2012 г., 19:42
Может быть, будет проще перенести ваш проект на2.1-SNAPSHOT?
 Pere Villega05 мая 2012 г., 19:52
@ 4e6 Я хотел бы избежать этого, если это возможно, поскольку я должен опубликовать его в Heroku, и я не верю, что SNAPSHOT доступен через SBT. Хотя, если это так, это будет работать

Ответы на вопрос(2)

Решение Вопроса

Под Модели, файл QueryBinders.scala:

package models

import play.api.mvc.{JavascriptLitteral, QueryStringBindable}


/**
 * Created with IntelliJ IDEA.
 * User: pvillega
 * Date: 07/05/12
 * Time: 12:06
 * QueryStringBinders for some data types missing in 2.0.1
 */
//TODO: remove when updating to 2.1
object QueryBinders {

  /**
   * QueryString binder for List
   */
  implicit def bindableList[T: QueryStringBindable] = new QueryStringBindable[List[T]] {
    def bind(key: String, params: Map[String, Seq[String]]) = Some(Right(bindList[T](key, params)))
    def unbind(key: String, values: List[T]) = unbindList(key, values)
  }

  private def bindList[T: QueryStringBindable](key: String, params: Map[String, Seq[String]]): List[T] = {
    for {
      values <- params.get(key).toList
      rawValue <- values
      bound <- implicitly[QueryStringBindable[T]].bind(key, Map(key -> Seq(rawValue)))
      value <- bound.right.toOption
    } yield value
  }

  private def unbindList[T: QueryStringBindable](key: String, values: Iterable[T]): String = {
    (for (value <- values) yield {
      implicitly[QueryStringBindable[T]].unbind(key, value)
    }).mkString("&")
  }

  /**
   * Convert a Scala List[T] to Javascript array
   */
  implicit def litteralOption[T](implicit jsl: JavascriptLitteral[T]) = new JavascriptLitteral[List[T]] {
    def to(value: List[T]) = "[" + value.map { v => jsl.to(v)+"," } +"]"
  }

}

On Build.scala:

 val main = PlayProject(appName, appVersion, appDependencies, mainLang = SCALA).settings(
      // Add your own project settings here
      lessEntryPoints <<= baseDirectory(_ / "app" / "assets" / "stylesheets" ** "style.less"),
      routesImport += "models.QueryBinders"
    )

Это нужно будет удалить при обновлении до 2.1, но это работает, и это позволяет избежать всех проблем, с которыми я пытался обновить проект до 2.1 Snapshot.

 Rajish21 окт. 2012 г., 18:32
Часть JavaScript была добавлена позже, поэтому исправленную версию можно найти здесь / Stackoverflow.com вопросы / 12997782 / ...

Ты можешь переместить свой проект, чтобы играть2.1-SNAPSHOTместо @ (см. «Создайте новое приложение, не установив Play» раздел документации). Все, что вам нужно, это изменитьsbt-plugin версия и добавить дополнительные резольверы. Вот моя версияplugins.sbt

resolvers ++= Seq(
  Resolver.url("Typesafe Ivy Snapshots", url("http://repo.typesafe.com/typesafe/ivy-snapshots/"))(Resolver.ivyStylePatterns),
  "Typesafe Releases" at "http://repo.typesafe.com/typesafe/releases/",
  "Typesafe Snapshots" at "http://repo.typesafe.com/typesafe/snapshots/",
  "Codahale Repo" at "http://repo.codahale.com")

addSbtPlugin("play" % "sbt-plugin" % "2.1-SNAPSHOT")
Обновит

Я не знаю, почему у тебя проблемы сslf4j зависимость. Это успешно загружено из типов безопасных выпусков для меня. Вы можете попытаться явно добавить этот репозиторий в конфигурацию вашего приложения (я имею в видуBuild.scala, неplugins.sbt).

[info] downloading http://repo.typesafe.com/typesafe/releases/org/slf4j/slf4j-api/1.6.1/slf4j-api-1.6.1.jar ...
[info]  [SUCCESSFUL ] org.slf4j#slf4j-api;1.6.1!slf4j-api.jar (538ms)
 4e605 мая 2012 г., 21:00
Я только что очистил свой локальный кеш плюща и сделалsbt clean update. Каждая зависимость была успешно обновлена с моей первоначальной конфигурации. У вас есть0.11.2 сбт версия?
 Pere Villega06 мая 2012 г., 11:10
все это не сработало в моем существующем проекте, все та же ошибка. Я обновлю вопрос.
 4e605 мая 2012 г., 20:46
Я верю,slf4j находится наDefaultMavenRepository, так что вы можете попробовать добавить его. Смотрите также предопределенные резольверы.
 Pere Villega05 мая 2012 г., 20:40
он не работает, он не работает с неразрешенными зависимостями от slf4j:

Ваш ответ на вопрос