CDI отсутствует @ViewScoped и @FlashScoped

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

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

Спасибо

2 ответа

Решение

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

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

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

  • CDI запускает событие AfterBeanDiscovery после каждого вызова компонента
  • Вы можете использовать расширение CDI для @Ob историями этого события и добавить свою реализацию контекста.
  • В своей области реализации вы можете:
    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/

Другие вопросы по тегам