Просмотр области в 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.