Просмотр объема в CDI Weld

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

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

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

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

Однако, когда я украшаю фасоль

@Named
@ViewScoped


@Inject
someDependency (...)

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

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


person Balu123    schedule 01.02.2011    source источник


Ответы (7)


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

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

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

Ваше здоровье,

Энди

person Andy Gibson    schedule 25.02.2011

Вы можете заставить @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.

person Distortum    schedule 02.01.2012

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

person Bozho    schedule 03.02.2011
comment
Спасибо за ваш ответ. Очень странно, что в CDI нет ViewScope. Если я не хочу добавлять в свой проект дополнительные фреймворки или библиотеки, как я могу добиться следующего: у меня есть компонент поддержки для страницы jsf. Этот bean-компонент сохраняет некоторые данные, введенные пользователем (так что bean-компонент не должен быть уничтожен во время этого!), И после того, как пользователь нажимает кнопку submit, ввод обрабатывается, и bean-компонент может быть уничтожен. Я не хочу использовать область сеанса или область приложения. Могу ли я как-то добиться этого с помощью стандартного CDI, может быть, разговора? Я имею в виду, что это очень простая ситуация, это должно быть возможно как-то - person Balu123; 11.02.2011
comment
Только что вышел финальный релиз seam3. Вы знаете, полностью ли он поддерживает GF 3.1. Я знаю, что перед финальной версией была пара проблем с GF 3.1, но я не уверен, что финальная версия исправит их все. - person Thang Pham; 07.04.2011
comment
Seam Faces 3.1.0 с GlassFish 3.1.1 по-прежнему не годится. Это работает, только если вы исправляете GlassFish последней версией Weld, но для многих это непрактично. GlassFish 3.1.2 будет содержать обновление для Weld (среди прочего), а первый релиз-кандидат должен быть выпущен в конце января 2012 года. - person Distortum; 01.01.2012

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

  • CDI запускает событие AfterBeanDiscovery после каждого вызова компонента.
  • Вы можете использовать расширение CDI для @Observe этого события и добавить реализацию контекста
  • In your scope implementation you can :
    1. Use Contextual to get your bean by its name from FacesContext ViewRoot Map and return it after each ajax call back
    2. Используйте CreationalContext, если имя bean-компонента из первого шага не найдено, чтобы создать его на карте корня просмотра FacesContext.

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

person Kurohige    schedule 26.04.2013
comment
очень интересная реализация. - person Genjuro; 27.04.2013

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

person Kevin Pauli    schedule 26.07.2011
comment
Не используйте эту реализацию, это совсем не правильно. Правильный можно найти, например, в goo.gl/sWdcl Сам контекст в goo.gl/2oRp3 - person Dar Whi; 25.08.2011
comment
Вышеупомянутые ссылки goo.gl: myfaces.apache.org/extensions/cdi и svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk/) - person Arjan; 31.01.2012

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

person Dar Whi    schedule 25.08.2011

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

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

person jacktrades    schedule 20.04.2013