Просмотр области в CDI Weld

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

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

@ManagedBean
@ViewScoped

@Inject
someDependency (...)

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

Однако, когда я украшаю подложку bean

@Named
@ViewScoped


@Inject
someDependency (...)

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

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

Ответ 1

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

Однако Managed beans не может использовать точки инжекции CDI, но может использовать ViewScope, в то время как CDI beans использует точки ввода CDI и все эти хорошие вещи, но ViewScope недоступен.

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

Приветствия,

Andy

Ответ 2

Вы можете получить @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.

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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