【问题标题】:Why am I getting "could not find implicit value for parameter messages: play.api.i18n.Messages"为什么我得到“找不到参数消息的隐含值:play.api.i18n.Messages”
【发布时间】:2016-12-16 17:35:21
【问题描述】:

我在 Messages("title") 上收到上述编译错误

import play.api.i18n.Messages
import play.api.mvc._
import scala.concurrent.Future 

trait ApplicationController extends Controller {

  def get = Action.async {
    implicit request => Future.successful(Ok(views.html.index(Messages("title"))))
  }
}

object ApplicationController extends ApplicationController

我在项目的conf文件夹中的messages文件包含以下内容

 title = hello

如果您想知道,我的模板包含以下内容:

@(title: String)

为什么会出现这个编译错误?

【问题讨论】:

    标签: scala scala-implicits


    【解决方案1】:

    您需要在 Play 2.5 中注入它。 例如,我的一个控制器的声明如下所示:

    import play.api.i18n.MessagesApi
    import javax.inject._
    
    class ApplicationController @Inject()(
                                               val messagesApi:MessagesApi,
                                               val env:Environment[User, CookieAuthenticator],
                                               implicit val webJarAssets:WebJarAssets,
                                               val timeZoneItemService:TimeZoneItemService,
                                               val userService: UserService,
                                               authInfoRepository: AuthInfoRepository,
                                               passwordHasher: PasswordHasher
                                             )
    

    您可以在此here 上阅读更多信息。

    【讨论】:

    • 无法让它正常工作,但现在我知道 play 2.4.x no loger 使用 Messages 而是使用 MessagesApi。我点击这个链接解决了我的问题link
    【解决方案2】:

    就像上面提到的 Alexander,我需要在 Play 2.5 中使用注入。工作代码现在如下所示:

    import play.api.i18n.{Messages, I18nSupport, MessagesApi}
    import play.api.mvc._
    import scala.concurrent.Future
    
    class ApplicationController @Inject()(val messagesApi:MessagesApi) extends Controller with I18nSupport{
    
      def get = Action.async {
        implicit request => Future.successful(Ok(views.html.index(Messages("title"))))
      }
    }
    

    如果您有一个测试类,您可以遵循以下逻辑并确保导入“play.api.i18n.Messages.Implicits._”:

    import controllers.ApplicationController
    import org.scalatestplus.play.{OneServerPerSuite, PlaySpec}
    import play.api.i18n.{MessagesApi, Messages}
    import play.api.i18n.Messages.Implicits._
    import play.api.mvc.Result 
    import play.api.test.FakeRequest
    import play.api.test.Helpers._
    import scala.concurrent.Future
    
    class ApplicationControllerSpec extends PlaySpec with OneServerPerSuite{
    
      val applicationController = new ApplicationController(app.injector.instanceOf[MessagesApi])
    
      "ApplicationController" must {
    
        "load front page successfully" in {
           val result: Future[Result] = applicationController.get().apply(FakeRequest())
    
           contentAsString(result) must include(Messages("home.title"))
        }
      }
    } 
    

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2018-01-06
      • 2016-09-19
      • 2015-08-28
      • 2016-02-22
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多