Почему метод @PostConstruct не вызывается с использованием BeanManager.getReference () для получения экземпляра? - PullRequest
1 голос
/ 31 января 2012

В настоящее время мы переходим от JSF-ManagedBeans к CDI.К сожалению, в прошлом мы чрезмерно использовали EL-Resolver для получения статического доступа к сессионным компонентам, управляемым JSF.

Поскольку внедрение зависимостей CDI доступно не везде, я переписал существующий статический поиск, чтобы использовать BeanManager (с использованием расширения припоя SEAM 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;

Кодработает и возвращает управляемый контейнером экземпляр нужного компонента. НО: методы, отмеченные @PostConstruct, не вызываются с помощью getReference().Возможно, вы, ребята, знаете, как это сделать.Не удалось найти что-то, гуглящее проблему: - /

С наилучшими пожеланиями!

1 Ответ

2 голосов
/ 31 января 2012

Вы должны использовать Application#evaluateExpressionGet() для этого.Не только для bean-компонентов CDI, но на самом деле и для bean-компонентов JSF, которые у вас были ранее.

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

Однако, гораздо чище просто использовать CDI @Inject или JSF @ManagedProperty вместо.

См. Также:

...