在另一个托管 bean 中获取托管 bean 引用
Posted
技术标签:
【中文标题】在另一个托管 bean 中获取托管 bean 引用【英文标题】:Get managed bean reference in another managed bean 【发布时间】:2012-12-12 23:14:58 【问题描述】:感谢这篇 BalusC 帖子,我尝试在另一个托管 bean 中获取托管 bean 的实例:here
使用findBean
方法,很棒,我检索了我的bean,但使用ManagedProperty
我无法获取我的bean。
我要注入的 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:不可能 de créer le bean géré «登录»。 Les problèmes suivants ont été détectés: - La propriété «locale» du bean géré «login» n'existe pas.
为什么?
【问题讨论】:
是不是因为我的locale
bean 可能在login
bean 之前没有实例化bean...?
我不太懂法语,但您是否为此属性创建了 getter 和 setter?
我刚看到这个帖子:***.com/questions/5165567/…。这确实是一个 getter/setter 问题。谢谢partlov
如果您将环境重新配置为使用英语语言环境,这将对您自己(以及将其作为问题发布时的其他人!)有所帮助。如果你搜索/google/share英文错误信息,你会得到更多的点击和更快的线索。
对不起,下次我会这样做。感谢您之前提到的 BalusC 帖子
【参考方案1】:
我看到您的 LocaleBean 是会话范围的。 您可以使用 servlet 上下文的 getSessionMap 方法直接从代码中引用另一个会话范围的托管 bean,而不是 @ManagedProperty 注释和 getter/setter:
LocaleBean locale = (LocaleBean) FacesContext.getCurrentInstance()
.getExternalContext().getSessionMap().get("locale");
【讨论】:
【参考方案2】:您应该为带有 @ManagedProperty 注释的 bean 编写 getter/setter
【讨论】:
【参考方案3】:如果你想在你的登录 bean 中调用 LocaleBean 需要是 SessionScoped 或更高版本。
如果你想在 Login Bean 上调用 Locale Bean,你必须这样做
@ManagedProperty("#locale")
private LocaleBean locale;
为此调用适当的 set e get。 你不需要这个
LocaleBean locale = findBean("locale");
您可以使用现在的语言环境,因为它在您的登录 Bean 中是这样的本地环境:
String s = local.getLocale();
【讨论】:
以上是关于在另一个托管 bean 中获取托管 bean 引用的主要内容,如果未能解决你的问题,请参考以下文章
在任何 Servlet 相关类中按名称获取 JSF 托管 bean
在类中使用托管bean设置变量,并从另一个托管bean中的此类获取变量
我可以在一个 xhtml 页面中使用多个 xhtml 页面以及如何访问(引用它们)托管 bean 类中的那些页面吗? [复制]