2011-02-01 5 views
11

Я хочу использовать область применения в моем приложении для бэкэнсов некоторых веб-страниц. Кроме того, я использую CDI для ввода зависимостей в бэкэнд.View Scope in CDI Weld

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

@ManagedBean 
@ViewScoped 

@Inject 
someDependency (...) 

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

Однако, когда я декорировать подкладочный боб с

@Named 
@ViewScoped 


@Inject 
someDependency (...) 

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

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

ответ

1

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

+0

Спасибо за ваш ответ. Странно, что в CDI нет ViewScope. Если я не хочу добавлять дополнительные рамки или библиотеки в свой проект, как я могу достичь следующего: У меня есть бэк-файл для страницы jsf. Этот компонент сохраняет некоторые данные от пользователя (поэтому этот компонент не должен быть уничтожен во время этого!), И после того, как пользователь попадет в submit, вход обрабатывается, и бит может быть уничтожен. Я не хочу использовать область сеанса или область приложения. Могу ли я достичь этого каким-то образом со стандартным CDI, может быть, разговора? Я имею в виду, что это очень простая ситуация, должно быть возможно как-то выпустить – Balu123

+1

финальный выпуск seam3. Знаете ли вы, полностью ли он поддерживает GF 3.1. Я знаю, что перед финальной версией были проблемы с GF 3.1, но я не уверен, что окончательный релиз исправить их все –

+0

Я не знаю, извините – Bozho

12

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

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

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

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

Энди

0

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

+0

Не используйте эту реализацию, это не совсем правильно. Правильный может быть найден, например. на http://goo.gl/sWdcl Сам контекст на http://goo.gl/2oRp3 –

+1

Вышеупомянутые ссылки goo.gl - http://myfaces.apache.org/extensions/cdi/ и https: // svn.apache.org/repos/asf/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/scope/ view/ViewScopedContext.java) – Arjan

7

Чтобы получить возможность работать с @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.

0

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

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

1

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

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

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

+1

очень интересная реализация. – Genjuro