我正在将Play网络应用迁移到v2.6,并且我无法理解依赖注入如何与Messages一起使用,因为消息依赖于请求的HTTP上下文。
我向控制器添加了一个字段注入,如下所示:
public class MyController extends Controller {
@Inject
private Messages m;
public Result all(String uuid){
// using m.at("xxxxxx")
}
}
我有这样的事情:
play.api.UnexpectedException: Unexpected exception[ProvisionException:
Unable to provision, see the following errors:
1) No implementation for play.i18n.Messages was bound.
while locating play.i18n.Messages
for field at
controllers.MyController.m(MyController.java:23)
while locating controllers.MyController
for the 5th parameter of router.Routes.<init>(Routes.scala:63)
然后我尝试通过在app文件夹中添加Module类来配置Messages接口的实现来修复它:
import com.google.inject.AbstractModule;
import play.i18n.Messages;
import play.libs.akka.AkkaGuiceSupport;
import play.mvc.Http;
public class Module extends AbstractModule implements AkkaGuiceSupport {
@Override
public void configure() {
bind(Messages.class).toInstance(Http.Context.current().messages());
}
}
这给了我另一个错误:
1) No implementation for play.i18n.Messages was bound.
at Module.configure(Module.java:10) (via modules:
com.google.inject.util.Modules$OverrideModule -> Module)
2) An exception was caught and reported. Message: There is no HTTP
Context available from here.
at com.google.inject.util.Modules$OverrideModule.configure(Modules.java:177)
我看了code example of how DI works with Play,但我认为这已经在Play for Messages中实现了。
我开始认为我应该在每个控制器中使用Http.Context.current()。messages()然后通过构造函数将它传递给任何其他类,这是详细的,也许它会破坏目的首先是DI。
答案 0 :(得分:2)
或者,如果使用Scala,请在控制器中添加I18nSupport,并确保您的操作添加implicit request =>
以使用默认语言丰富请求:
import play.api.i18n._
@Singleton
class HomeController @Inject()(cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {
def index() = Action { implicit request =>
Ok(views.html.index())
}
}
在主模板和特定模板中,请确保导入MessagesProvider:
@()(implicit messagesProvider: play.api.i18n.MessagesProvider)
无论你在模板中的哪个地方添加i18n这样的消息:
<h1>@messagesProvider.messages("app.title")</h1>
答案 1 :(得分:1)
您需要在构造函数中初始化它并使用它如下
public class MyController extends Controller {
private final play.i18n.MessagesApi messagesApi;
@Inject
public MyController (MessagesApi messagesApi) {
this.messagesApi = messagesApi;
}
public Result all(String uuid){
messagesApi.get(Lang.forCode("en"), "hello");
}
}