CDI отсутствует @ViewScoped и @FlashScoped - PullRequest
6 голосов
/ 19 октября 2011

Почему в CDI Java EE 6 отсутствуют аннотации @ViewScoped и @FlashScoped? (особенно первое заставляет меня задуматься, поскольку CDI происходит из мира Seam, который уже знал очень похожий ScopeType.PAGE ...)

Каковы рекомендуемые обходные пути при использовании CDI? Использовать шов 3?

Спасибо

Ответы [ 2 ]

12 голосов
/ 19 октября 2011

@ViewScoped относится только к JSF фреймворка MVC, а не к CDI фреймворка внедрения зависимостей. Область действия представления сохраняется до тех пор, пока вы взаимодействуете с одним и тем же представлением JSF. CDI на самом деле не имеет понятия «взгляды». Альтернативой CDI является @ConversationScoped, который живет дольше, чем область запроса, но короче, чем область сеанса. Вы только должны контролировать завершение самостоятельно. При необходимости вы можете использовать MyFaces CODI для соединения JSF @ViewScoped с компонентами CDI @Named. Предстоящий JSF 2.2 будет иметь CDI-совместимый @ViewScoped в пакете javax.faces.view.

@FlashScoped не существует в JSF. JSF flash scope в основном состоит из карты, которая поддерживается недолговечным cookie-файлом, который выживает при перенаправлениях HTTP. Вы не можете позволить JSF помещать управляемые компоненты в эту область. Вы должны вручную поместить / получить значения в / из карты и / или использовать ссылку #{flash} в EL, которая в основном ссылается на карту. Лицевые швы , однако, похитили специфический для JSF пакет javax.faces.bean для своей аннотации @FlashScoped, но это определенно не из стандартного API JSF.

Смотри также:

0 голосов
/ 29 апреля 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/

...