我在模型包中有一个名为 CoordinatesTranslationDTO 的case类:
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("&")
}
}
}
我在routes文件中的路线如下所示:
GET /people/translation controllers.PeopleController.getOrCreatePersonLocation(p: models.CoordinatesTranslationDTO)
我已经运行了sbt clean
,set 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
2条答案
按热度按时间p8h8hvxi1#
你至少忘记了一件事,那就是你的路由文件中的add参数。你的路由中的
:p
参数。它应该和你传递给getOrCreatePersonLocation
函数的参数相同。bqf10yzr2#
我认为问题实际上是Play找不到一个隐式的
QueryStringBindable[BigDecimal]
,这是您的coordinatesTranslationStringBinder
所必需的。这个错误信息是误导性的,它是由Play中的以下代码生成的,它无法区分i)
QueryStringBindable[A]
根本没有实现,或者ii)QueryStringBindable[A]
有一个实现,但它的隐含要求无法满足:我也遇到了同样的问题,我必须仔细阅读源代码,然后通过逐个调用我隐式提供的每个子绑定器来缩小范围,直到找到罪魁祸首。太神奇了!
(You可以使用
mvc/Binders.scala
中的Parsing
助手类实现BigDecimal
的绑定器。)我看不出Play如何能轻松地修复这个错误消息。也许他们可以在这个消息中添加“(或其隐式依赖关系无法解析)”。