我问了一个非常相关的问题:
How to injection a non-serializable class (like java.util.ResourceBundle) with Weld
在 Seam 论坛内部:
http ://seamframework.org/Community/HowToCreateAnInjectableResourcebundleWithWeld
总结一下:我实现了一个具有 3 个生产者的可注入 ResourceBundle。首先你需要一个 FacesContextProducer。我从 Seam 3 Alpha 资源中获取了一个。
public class FacesContextProducer {
@Produces @RequestScoped
public FacesContext getFacesContext() {
FacesContext ctx = FacesContext.getCurrentInstance();
if (ctx == null)
throw new ContextNotActiveException("FacesContext is not active");
return ctx;
}
}
然后你需要一个使用 FacesContextProducer 的 LocaleProducer。我还从 Seam 3 Alpha 中获取了它。
public class FacesLocaleResolver {
@Inject
FacesContext facesContext;
public boolean isActive() {
return (facesContext != null) && (facesContext.getCurrentPhaseId() != null);
}
@Produces @Faces
public Locale getLocale() {
if (facesContext.getViewRoot() != null)
return facesContext.getViewRoot().getLocale();
else
return facesContext.getApplication().getViewHandler().calculateLocale(facesContext);
}
}
现在你已经拥有了创建 ResourceBundleProducer 的一切,它看起来像这样:
public class ResourceBundleProducer {
@Inject
public Locale locale;
@Inject
public FacesContext facesContext;
@Produces
public ResourceBundle getResourceBundle() {
return ResourceBundle.getBundle("/messages", facesContext.getViewRoot().getLocale() );
}
}
现在您可以将 ResourceBundle @Inject 注入到您的 bean 中。注意它必须被注入到一个临时属性中,否则你会得到一个异常,抱怨 ResourceBundle 不可序列化。
@Named
public class MyBean {
@Inject
private transient ResourceBundle bundle;
public void testMethod() {
bundle.getString("SPECIFIC_BUNDLE_KEY");
}
}