为什么不使用BeanManager.getReference()来获取@PostConstruct方法来获取实例?

时间:2012-01-31 16:20:10

标签: jsf-2 seam cdi

我们目前正在从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()注释的方法。也许你们知道怎么做。找不到任何谷歌搜索问题: - /

祝你好运!

1 个答案:

答案 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代替。

另见: