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