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.
Смотрите также:
- Добавить элементы в список в запросе Scoped Bean - содержит несколько конкретных примеров альтернатив CDI
Вы можете реализовать контекст и использовать @NormalScope для создания своего собственного CDI Scope без использования любой другой инфраструктуры или ожидания новой JEE7.
- CDI запускает событие AfterBeanDiscovery после каждого вызова компонента
- Вы можете использовать расширение CDI для @Ob историями этого события и добавить свою реализацию контекста.
- В своей области реализации вы можете:
- Используйте Contextual, чтобы получить ваш бин по его имени из FacesContext ViewRoot Map и возвращать его после каждого обратного вызова ajax
- Используйте CreationalContext, если имя компонента из первого шага не найдено, чтобы создать его на FacesContext ViewRoot Map
для более глубокого объяснения я рекомендую эту ссылку: http://www.verborgh.be/articles/2010/01/06/porting-the-viewscoped-jsf-annotation-to-cdi/