JSF 托管 Bean 自动创建?

2022-09-03 05:09:46

是否可以自动创建 JSF 受管 Bean?

例如,我有几个会话范围的bean。有时有必要在代码中访问这些实例(而不仅仅是在JSF中),这是通过以下方式完成的:

PageBean pageBean = (PageBean) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("pages");

但是,如果没有访问过哪个页面调用“#{pages}”,这将解析为空...当范围“开始”时,是否有让JSF创建bean?因此,在这种情况下,理想情况下,当用户会话开始时,“页面”bean将立即在会话中实例化?


答案 1

请改用 Application#evaluateExpressionGet()。它将在尚未完成时创建bean。

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{bean}", Bean.class);

其中 是受管 Bean 名称,并且是适当的后备 Bean 类。"bean"Bean.class

如有必要,您可以将它包装在帮助器方法中,以便不需要强制转换(JSF男孩没有利用泛型和中的参数):ClassevaluateExpressionGet

public static <T> T findBean(String managedBeanName, Class<T> beanClass) {
    FacesContext context = FacesContext.getCurrentInstance();
    return beanClass.cast(context.getApplication().evaluateExpressionGet(context, "#{" + managedBeanName + "}", beanClass));
}

可用作:

Bean bean = findBean("bean", Bean.class);

或者不带类型,但带有 :@SuppressWarnings

@SuppressWarnings("unchecked")
public static <T> T findBean(String managedBeanName) {
    FacesContext context = FacesContext.getCurrentInstance();
    return (T) context.getApplication().evaluateExpressionGet(context, "#{" + managedBeanName + "}", Object.class);
}

可用作:

Bean bean = findBean("bean");

更新:以上是JSF 1.2特有的。以下是 JSF 1.1 或更早版本使用当前已弃用的 Application#createValueBinding() 的方法

FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().createValueBinding("#{bean}").getValue(context);

答案 2

那么这个解决方案呢:

public static Object getBean(String beanName)
{          
    Object returnObject = FacesContext.getCurrentInstance().getELContext().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, beanName);  
    if (returnObject == null)  
        System.out.println("Bean with name " + beanName + " was not found. Check the faces-config.xml file if the given bean name is ok.");          
    return returnObject;
}

通过这种方式,您甚至可以避免Bean.class参数。


推荐