首页 > 解决方案 > 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)

非常感谢。如果已经问过类似的问题,请接受我的道歉。

标签: scalaplayframework

解决方案


如 Play文档所示,您的控制器类应该注入(您可以import com.google.inject.Inject注入)ControllerComponents、扩展AbstractControllerI18nSupport

class MyController  @Inject()(cc: ControllerComponents)
  extends AbstractController(cc) with play.api.i18n.I18nSupport { 
    ??? //your controller methods
} 

您还需要在视图文件中使用requestHeaderMessageProvider实例:

@(viewsElement: String)(implicit request: RequestHeader, messagesProvider: MessagesProvider)

推荐阅读