如何在Play Framework 2.6应用程序中通过依赖注入使用消息?

时间:2017-10-03 17:56:48

标签: playframework playframework-2.5

我正在将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。

2 个答案:

答案 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)

  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");
        }
    
    }