Посмотреть область в CDI Weld - PullRequest
11 голосов
/ 01 февраля 2011

Я хочу использовать область действия @ViewScoped в своем приложении для поддержки компонентов некоторых веб-страниц.Также я использую CDI для внедрения зависимостей в бэк-бины.

Однако, когда я использую вспомогательный компонент с такой аннотацией

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

, аннотация @Inject ничего не внедрит, и я получаю NullPointerException, как только я получаю доступ к зависимости.

Однако, когда я украшаю поддерживающий компонент с помощью

@Named
@ViewScoped


@Inject
someDependency (...)

, инъекция работает нормально, но теперь @ViewScoped игнорируется, поскольку она не является частью CDI / Weld.

Как я могу использовать @ViewScoped вместе с CDI Weld?

Ответы [ 7 ]

12 голосов
/ 25 февраля 2011

Проблема в том, что вы смешиваете простые управляемые bean-компоненты с управляемыми bean-компонентами CDI, и они не работают вместе.Управляемые компоненты - это простая структура для определения компонентов и их добавленных компонентов.CDI - это отдельный зверь со всеми видами дополнительного совершенства.

Однако управляемые bean-компоненты не могут использовать точки ввода CDI, но могут использовать ViewScope, в то время как CDI-компоненты используют точки ввода CDI и все такое хорошее, но ViewScopeнедоступно.

Чтобы решить эту проблему, вы должны либо использовать CDI и использовать библиотеку Seam-Faces для использования области просмотра, либо отбросить CDI и придерживаться простых управляемых компонентов, что является простой реализацией.

Ура,

Энди

7 голосов
/ 02 января 2012

Вы можете заставить @javax.faces.bean.ViewScoped работать, включив в свой проект флягу Seam Faces 3.1.0.

В противном случае (т. Е. Вы используете GlassFish 3.1.1 или более раннюю версию), вы можете просто скопироватьViewContextExtension.java, ViewScopedContext.java и javax.enterprise.inject.spi.Extension из Seam Faces 3.1.0 в ваш собственный проект, гарантируя, что вы используете тот же путь к файлам, что и Seam Faces.Файлы Java могут быть скопированы дословно.Все строки, кроме одной, заканчивающейся ViewContextExtension, должны быть удалены из javax.enterprise.spi.Extension.

Я успешно использую последний метод в GlassFish 3.1.1 и попробую первый метод GlassFish 3.1.2 выпущено.

1 голос
/ 26 апреля 2013

Вы можете реализовать @NormalScope для создания своего собственного CDI Scope без использования любой другой инфраструктуры или ожидания нового JEE7

  • CDI запускает событие AfterBeanDiscovery после каждого вызова компонента
  • Вы можете использовать расширение CDI для @ Наблюдения этого события и добавить свою реализацию контекста
  • В вашей области реализации вы можете:
    1. Используйте Contextual , чтобы получить ваш бин по его имени из FacesContext ViewRoot Map и вернуть его после каждого обратного вызова ajax
    2. Используйте CreationalContext , если не найдено имя компонента из первого шага для его создания в FacesContext ViewRoot Map

для более подробного объяснения я рекомендую эту ссылку: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/

1 голос
/ 03 февраля 2011

Нет, это не поддерживается напрямую. Seam3 должен обеспечивать такие дополнительные возможности, которых нет у CDI.Проверьте это.

0 голосов
/ 21 апреля 2013

Я думаю, что Apache CODI или Seam 3 решает эту проблему.Есть новый проект под названием DeltaSpike, который может это делать, но продолжайте. Шам 3.

В Java EE 7 эта проблема будет решена, так как я понимаю, что все bean-компоненты являются bean-компонентами CDI, поэтому JSF отсутствуетбобы.

0 голосов
/ 25 августа 2011

Сварка в сочетании с лицевыми швами может обеспечить это, но оно сломано.Интересная нить об этом и альтернативе для этого, например, на http://forum.primefaces.org/viewtopic.php?f=3&t=7585

0 голосов
/ 26 июля 2011

Я не использую Seam, просто обычные JSF + PrimeFaces.Я только что нашел это и собираюсь попробовать ... вы тоже можете.

...