首页 > 解决方案 > Play Framework 找不到 QueryStringBinders

问题描述

我在模型包中有一个名为CoordinatesTranslationDTO的案例类:

case class CoordinatesTranslationDTO(locale: String, lat: BigDecimal, lng: BigDecimal)

我在 QueryStringBinders 控制器中导入它,如下所示:

import models.CoordinatesTranslationDTO

我在 QueryStringBinders 控制器中的对象实现如下所示:

object QueryStringBinders {
  implicit def coordinatesTranslationStringBinder(
                                                   implicit bigDecimalBinder: QueryStringBindable[BigDecimal],
                                                   stringBinder: QueryStringBindable[String]
                                                 ): QueryStringBindable[CoordinatesTranslationDTO] =
    new QueryStringBindable[CoordinatesTranslationDTO] {
      private def subBind[T](key: String, subkey: String, params: Map[String, Seq[String]])
                            (implicit b: QueryStringBindable[T]): Either.RightProjection[String, Option[T]] = {
        b.bind(s"$key.$subkey", params).map(_.right.map(r => Option(r))).getOrElse(Right(None)).right
      }

      override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, CoordinatesTranslationDTO]] = Some {
        def bnd[T](s: String)(implicit b: QueryStringBindable[T]) = subBind[T](key, s, params)

        for {
          locale <- bnd[String]("locale")
          lat <- bnd[BigDecimal]("lat")
          lng <- bnd[BigDecimal]("lng")
        } yield CoordinatesTranslationDTO(locale, lat, lng)
      }

      override def unbind(key: String, coordinates: CoordinatesTranslationDTO): String = {
        def ubnd[T](key: String, s: Option[T])(implicit b: QueryStringBindable[T]) = s.map(f => b.unbind(key, f))

        val keys = Seq(
          ubnd("lat", coordinates.lat),
          ubnd("lng", coordinates.lng),
          ubnd("locale", coordinates.locale)
        ).flatten
        keys.mkString("&")
      }
    }
}

我在路由文件中的路由如下所示:

GET           /people/translation                                                          controllers.PeopleController.getOrCreatePersonLocation(p: models.CoordinatesTranslationDTO)

我已经运行了sbt clean,设置cleanFiles了,天知道还有多少命令。但似乎没有任何效果。我得到的是:

[error] /Users/developmentuser/Desktop/Jobs/parent/solar/conf/routes:269:1: No QueryString binder found for type models.CoordinatesTranslationDTO. Try to implement an implicit QueryStringBindable for this type

标签: scalaplayframeworkplayframework-2.2playframework-2.3querystringparameter

解决方案


您忘记的至少一件事是在您的路线文件中添加参数。您路线中的:p参数。它应该与您传递给getOrCreatePersonLocation函数的相同。

GET   /people/translation/:p   controllers.PeopleController.getOrCreatePersonLocation(p: models.CoordinatesTranslationDTO)

推荐阅读