改为使用Application#evaluateExpressionGet()
。它会在尚未完成时创建 bean。
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{bean}", Bean.class);
"bean"
托管 bean 名称在哪里,并且Bean.class
是适当的支持 bean 类。
如有必要,您可以将其包装在辅助方法中,这样就不需要强制转换(JSF 男孩没有利用泛型和Class
in 中的参数evaluateExpressionGet
):
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);