在另一个托管bean中获取托管bean引用

5

我试图通过这篇的帖子(链接在此)在另一个托管bean中获取托管bean的实例。

使用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;
   }

}

因此,当我在我的登录 bean 中调用 LocaleBean locale = findBean("locale"); 时它可以工作,但是:

@ManagedProperty("#{locale}") // OR localeBean, LocaleBean...
private LocaleBean locale;

无法运行...

com.sun.faces.mgbean.ManagedBeanCreationException: 无法创建托管 bean “login”。检测到以下问题: - 托管 bean “login”的属性“locale”不存在。

为什么?


是因为我的locale bean在login bean之前可能还没有被实例化吗? - Olivier J.
1
我不太懂法语,但是你为这个属性创建了getter和setter吗? - partlov
1
我刚看到这篇帖子:https://dev59.com/u2435IYBdhLWcg3w3EIi。确实是一个getter/setter问题。谢谢partlov。 - Olivier J.
如果您重新配置环境以使用英语区域设置,则对自己(以及在将其发布为问题时的其他人)会很有帮助!如果您搜索/谷歌/共享英语错误消息,您将获得更多的命中和更快的线索。 - BalusC
下次我会做的,抱歉。感谢您之前提到的帖子,BalusC。 - Olivier J.
3个回答

4

如果你使用 @ManagedProperty 注解,则需要编写 bean 的 getter/setter 方法。


2

我看到你的LocaleBean是会话范围的。 而不是使用@ManagedProperty注释和getter/setter,你可以直接从代码中使用servlet上下文的getSessionMap方法引用另一个会话范围的托管bean:

LocaleBean locale = (LocaleBean) FacesContext.getCurrentInstance()
                    .getExternalContext().getSessionMap().get("locale");

0

如果您想在登录Bean中调用LocaleBean,则需要将其作用域设置为SessionScoped或更高。

如果您想在登录Bean上调用Locale Bean,则必须执行以下操作

@ManagedProperty("#{locale}")
private LocaleBean locale;

调用相应的set和get方法即可。 你不需要这个。

LocaleBean locale = findBean("locale");

现在您可以在登录Bean中像这样使用本地语言:

String s = local.getLocale(); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接