我在SO上问了一个相关的问题:
如何使用Weld注入一个不可序列化的类(如java.util.ResourceBundle)
在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;
}
}
那么你需要一个LocaleProducer,它使用FacesContextProducer。我也是从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");
}
}
@ManagedProperty("#{msgs}") private ResourceBundle msgs;
(带有setter)。 - BalusC