我尝试在另一个托管bean中获得托管bean的实例,这要归功于BalusC post: here
使用findBean
方法,这很好,我检索了我的bean,但使用ManagedProperty
我无法获得我的bean。
我要注射的是这个:
@ManagedBean(name="locale")
@SessionScoped
public class LocaleBean {
private String locale;
public String getLocale() {
return locale;
}
public void setLocale(String locale) {
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale(locale));
this.locale = locale;
}
}
所以当我在login
bean中调用LocaleBean locale = findBean("locale");
时,它是工作的,但是:
@ManagedProperty("#{locale}") // OR localeBean, LocaleBean...
private LocaleBean locale;
行不通…
com.sun.faces.mgbean。ManagedBeanCreationException: Impossible de crasser le bean gsgr«login»。所有的问题都不能解决。- La propri«locale»du bean«login»n 'existe pas.
您应该为bean编写getter/setter,并注释为@ManagedProperty
我看到你的LocaleBean是会话作用域。除了@ManagedProperty注释和getter/setter之外,您可以使用servlet上下文的getSessionMap方法直接从代码中引用另一个会话作用域的托管bean:
LocaleBean locale = (LocaleBean) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("locale");
如果你想在你的登录bean中调用LocaleBean需要是SessionScoped或以上。
如果你想在登录Bean上调用Locale Bean,你必须执行
@ManagedProperty("#{locale}")
private LocaleBean locale;
调用相应的set e get。你不需要这个
LocaleBean locale = findBean("locale");
你现在可以使用locale,因为它是本地的,就像在你的登录Bean中这样:
String s = local.getLocale();