为什么我得到 "could not find implicit value for parameter messages: play.api.i18n.Messages"
Why am I getting "could not find implicit value for parameter messages: play.api.i18n.Messages"
我在 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 文件夹中的消息文件包含以下内容
title = hello
如果您想知道,我的模板采用了以下内容:
@(title: String)
为什么会出现此编译错误?
你需要在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。
像上面提到的Alexander,我需要在Play 2.5中使用inject。工作代码现在看起来像这样:
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"))))
}
}
如果你有测试 class 你可以遵循以下逻辑并确保你导入 "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"))
}
}
}
我在 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 文件夹中的消息文件包含以下内容
title = hello
如果您想知道,我的模板采用了以下内容:
@(title: String)
为什么会出现此编译错误?
你需要在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。
像上面提到的Alexander,我需要在Play 2.5中使用inject。工作代码现在看起来像这样:
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"))))
}
}
如果你有测试 class 你可以遵循以下逻辑并确保你导入 "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"))
}
}
}