【问题标题】:Migrating to 2.6 and Form error No implementation for play.i18n.Messages was bound迁移到 2.6 和 Form 错误 No implementation for play.i18n.Messages is bound
【发布时间】:2019-05-07 20:57:37
【问题描述】:

在我的项目中,我在控制器范围之外定义了一个 SignupForm ...原因是我需要从不同的源文件中重用它。

package views.form

import javax.inject.{Inject, Singleton}
import play.api.data.Form
import play.api.data.Forms._
import play.api.i18n.Messages

case class Signup(email: String, password: String, repeatPassword: String, name: String) extends MyUsernamePassword

@Singleton
class SignupForm @Inject() (implicit val messages: Messages) {
  val Instance = Form {
    mapping(
      "email" -> email,
      "password" -> nonEmptyText(minLength = 5),
      "repeatPassword" -> nonEmptyText(minLength = 5),
      "name" -> nonEmptyText
    )(Signup.apply)(Signup.unapply).
      verifying(messages("playauthenticate.password.signup.error.passwords_not_same"),
        data => (data.password != null) && data.password.equals(data.repeatPassword))
  }
}

但这会导致运行时错误No implementation for play.i18n.Messages was bound。我该如何解决?

【问题讨论】:

    标签: scala playframework playframework-2.6


    【解决方案1】:

    迁移到MessagesApi

    import javax.inject.{Inject, Singleton}
    import play.api.data.Form
    import play.api.data.Forms._
    import play.api.i18n.{Lang, Langs, MessagesApi}
    
    case class Signup(email: String, password: String, repeatPassword: String, name: String) extends MyUsernamePassword
    
    @Singleton
    class SignupForm @Inject() (implicit val langs: Langs, val messagesApi: MessagesApi) {
      implicit val lang: Lang = langs.availables.head
      val Instance = Form {
        mapping(
          "email" -> email,
          "password" -> nonEmptyText(minLength = 5),
          "repeatPassword" -> nonEmptyText(minLength = 5),
          "name" -> nonEmptyText
        )(Signup.apply)(Signup.unapply).
        verifying(messagesApi("playauthenticate.password.signup.error.passwords_not_same")(lang),
          data => (data.password != null) && data.password.equals(data.repeatPassword))
      }
    }
    

    您需要在配置文件中指定您的语言。例如,play.i18n.langs = [ "en", "en-US", "fr" ]。更多详情请见here

    【讨论】:

    • 谢谢!!我之前一直在使用MessagesApi,但它需要一个 Lang 隐式,在迁移到 2.6 后不再注入。我在这里阅读以使用消息代替:playframework.com/documentation/2.7.x/….
    • 一问:为什么会在val lang: Lang = ... 语句中选择任意语言?我希望它隐含地来自某处的请求......但是,它完成了工作,运行时错误现在消失了。
    • @SkyWalker 我刚刚复制了val lang: Lang = langs.availables.head 作为虚拟代码,但我相信你通常会从val lang: Lang = request.messages.lang 之类的请求中提取语言,但在你的情况下,因为这在你的控制器之外需要一些逻辑来选择正确的语言,独立于请求(不确定你现在是如何做到的)
    猜你喜欢
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 2016-02-19
    相关资源
    最近更新 更多