【问题标题】:How to inject MessagesApi outside a controller?如何在控制器外部注入 MessagesApi?
【发布时间】:2017-03-01 21:37:41
【问题描述】:

我有一个简单的类服务,它被漂亮地注入到我的应用程序中。但是,我试图注入 messages api 来读取我的消息文件中的一些键,但我得到了同样的错误:

1) 在 play.i18n.Messages 中找不到合适的构造函数。 类必须有一个(并且只有一个)带有注释的构造函数 @Inject 或非私有的零参数构造函数。在 play.i18n.Messages.class(Messages.java:61)

public class SampleServiceImpl implements SampleService {
  private MessagesApi messages;

  @Inject
  public SampleServiceImpl(MessagesApi messages){
     this.messages = messages;
  }
}

@ImplementedBy(SampleServiceImpl.class)
    public interface SampleService {
}

DI 有办法做到这一点吗?

编辑:

我能够通过这样做获得价值,但它看起来并不优雅,有什么选择吗?

messages.get(new Lang(new Locale("en")), "ticket.form.title")

【问题讨论】:

  • 为什么当你尝试注入MessagesApi时它会抱怨Messages

标签: java playframework playframework-2.0 playframework-2.5


【解决方案1】:

这种“不优雅”的原因是语言(和Messages)取决于请求。

默认行为是消息根据 cookie、可用语言和默认语言检测当前语言。

引擎盖下的某些软件:Messages messages = messagesApi.preferred(request());

  • 将根据语言从请求中选择一种语言 可用,如果没有,则回退到默认语言 有候选人。

幸运的是,there is a special method 您可以使用您想要的语言来初始化Messages

import play.i18n.MessagesApi;
import play.i18n.Messages;
import play.i18n.Lang;

import java.util.Arrays;
import java.util.List;
import java.util.Locale;

...

Locale englishLocale = new Locale("en");
Lang englishLang = new Lang(englishLocale);
List<Lang> prefferedLangs = Arrays.asList(englishLang);

Messages messagesCustom = messagesApi.preferred(prefferedLangs);

// the time for elegancy 
messages.at("ticket.form.title");

我建议你创建一个很小的MessagesApiCustom 服务,它会在初始化时执行这几行代码,然后将at 方法代理到messages.at,所以它看起来像:

public class SampleServiceImpl implements SampleService {
  private MessagesApiCustom messages;

  @Inject
  public SampleServiceImpl(MessagesApiCustom messages){
     this.messages = messages;
  }

  private void doSomeStuff(){
    Strign message = messages.at("message.key")
  }
}

你可以更进一步,实现基于注解的语言选择:

 @Named("FR")
 private MessagesApiCustom messages;

当然,如果您需要动态语言选择,那么只需使用 Play 中已有的方法即可。

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2013-10-27
    相关资源
    最近更新 更多