Используйте взамен Application#evaluateExpressionGet()
. Он создаст бин, когда он еще не сделан.
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{bean}", Bean.class);
Где "bean"
- это имя управляемого компонента, а Bean.class
- соответствующий класс вспомогательного компонента.
Вы можете при необходимости обернуть это вспомогательным методом, так что приведение не нужно (ребята из JSF не воспользовались обобщениями и параметром Class
в 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);