如何在控制器外注入MessagesApi?

时间:2017-03-01 21:37:42

标签: java playframework playframework-2.0 playframework-2.5

我有一个简单的类服务,它正在我的应用程序上精美注入。但是,我试图注入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")

1 个答案:

答案 0 :(得分:3)

这种"非优雅的原因"该语言(和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中已存在的方法即可。