scala - Scala Play 框架:从 QueryStringBindable 访问消息
问题描述
请问您对 v2.6.13 的 Play 框架的帮助。我试图验证查询字符串参数,因此我实现了以下 QueryStringBindable:
import play.api.data.validation._
import play.api.i18n.Messages
import play.api.mvc.QueryStringBindable
import scala.util.{Failure, Success, Try}
case class PagingParams(offset: Int, limit: Int)
object PagingParams {
val DefaultOffset = 1
val DefaultLimit = 20
val OffsetParamKey = "offset"
val LimitParamKey = "limit"
val ValidationConstraints = Seq(Constraints.min(1), Constraints.max(100000))
implicit def queryStringBinder(implicit intBinder: QueryStringBindable[Int]) = new QueryStringBindable[PagingParams] {
override def bind(key: String, params: Map[String, Seq[String]]): Option[Either[String, PagingParams]] = {
val result = for {
offset <- Try(intBinder.bind(OffsetParamKey, params).get).recover {
case _ => Right(DefaultOffset)
}
limit <- Try(intBinder.bind(LimitParamKey, params).get).recover {
case _ => Right(DefaultLimit)
}
} yield {
(offset.right.toOption, limit.right.toOption)
}
result match {
case Success((maybeIndex, maybeLimit)) =>
ParameterValidator(ValidationConstraints, maybeIndex, maybeLimit) match {
case Valid =>
Some(Right(PagingParams(maybeLimit.get, maybeLimit.get)))
case Invalid(errors) =>
Some(Left(errors.zip(Seq(OffsetParamKey, LimitParamKey)).map {
case (ValidationError(message, value), param) => Messages(message, param, value)
}.mkString(", ")))
}
case Failure(e) => Some(Left(s"Invalid paging params: ${e.getMessage}"))
}
}
override def unbind(key: String, pagingParams: PagingParams): String =
intBinder.unbind(OffsetParamKey, pagingParams.offset) + "&" + intBinder.unbind(LimitParamKey, pagingParams.limit)
}
}
问题是正在运行的应用程序我收到以下错误:
未找到隐式 MessagesProvider 实例。
不幸的是,我找不到任何关于如何隐式注入 MessagesProvider 的帮助,以便我可以从消息文件中检索消息。
这是我的端点在路由文件中的样子:
GET /table controllers.TableController.index(pagingParams: PagingParams)
非常感谢。如果已经问过类似的问题,请接受我的道歉。
解决方案
如 Play文档所示,您的控制器类应该注入(您可以import com.google.inject.Inject
注入)ControllerComponents
、扩展AbstractController
和I18nSupport
:
class MyController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) with play.api.i18n.I18nSupport {
??? //your controller methods
}
您还需要在视图文件中使用requestHeader
和MessageProvider
实例:
@(viewsElement: String)(implicit request: RequestHeader, messagesProvider: MessagesProvider)
推荐阅读
- python-3.x - 我正在尝试在输入框小部件中显示我的输出,但执行时没有显示任何内容但没有错误
- discord.py - 如何在 discord.py 中查看用户的创建日期?
- python-3.x - 将 DMXPY 与转换状态机一起使用
- python - 在 VS Code 中是否有任何快捷方式可以为 Django 制作 {% %}?
- nativescript - Nativescript firebase admob 在第一次在 ios 上之后没有触发某些事件
- sql - SQLite 中的 SQL EXIST 语句
- angular - Jasmine 测试无法识别函数 getCurrentNavigation():this.router.getCurrentNavigation is not a function
- python - Homebrew python版本与Mac python版本不同?
- python - TypeError:NoneType 对象不可迭代
- python - 如何在 PyPi 的包中包含 csv 文件?