在另一个托管 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 引用的主要内容,如果未能解决你的问题,请参考以下文章

如何引用 JAR 文件中提供的 JSF 托管 bean?

在JSF托管bean的构造函数中访问会话bean数据

在任何 Servlet 相关类中按名称获取 JSF 托管 bean

在类中使用托管bean设置变量,并从另一个托管bean中的此类获取变量

我可以在一个 xhtml 页面中使用多个 xhtml 页面以及如何访问(引用它们)托管 bean 类中的那些页面吗? [复制]

如何从托管 bean 中获取消息包字符串?