我们目前正在从JSF-ManagedBeans迁移到CDI。遗憾的是,我们过去曾过度使用EL-Resolver,以获得对JSF管理的会话范围bean的静态访问。
由于CDI依赖注入在任何地方都不可用,我重写了现有的静态查找以使用BeanManager
(使用SEAM-Solder扩展BeanManagerAware
)。
Iterator<Bean<?>> iterator = beans.iterator();
Bean<T> bean = (Bean<T>) iterator.next(); // possible NPE, I know :)
CreationalContext<T> creationalContext = beanManager.createCreationalContext(bean);
T contextual = (T) beanManager.getReference(bean, type, creationalContext);
return contextual;
代码工作并返回所需bean的容器管理实例。 BUT:使用@PostConstruct
调用使用getReference()
注释的方法。也许你们知道怎么做。找不到任何谷歌搜索问题: - /
祝你好运!
答案 0 :(得分:2)
您应该使用Application#evaluateExpressionGet()
。不仅适用于CDI bean,实际上也适用于以前的JSF bean。
FacesContext context = FacesContext.getCurrentInstance();
Bean bean = (Bean) context.getApplication().evaluateExpressionGet(context, "#{beanName}", Bean.class);
// ...
然而,更清洁的是使用CDI的@Inject
或JSF的@ManagedProperty
代替。