SO でかなり関連する質問をしました:
How to inject a non-serializable class (like java.util.ResourceBundle) with Weld
Seam フォーラム内:
http://seamframework.org/Community/HowToCreateAnInjectableResourcebundleWithWeld
要約すると、3 つの Producer を持つ注入可能な ResourceBundle を実現しました。まず、FacesContextProducer が必要です。Seam 3 Alpha ソースから 1 つを取得しました。
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 を Bean に @Inject できるようになりました。一時的な属性に挿入する必要があることに注意してください。そうしないと、ResourceBundle がシリアル化できないという例外が発生します。
@Named
public class MyBean {
@Inject
private transient ResourceBundle bundle;
public void testMethod() {
bundle.getString("SPECIFIC_BUNDLE_KEY");
}
}