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

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

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

Спасибо

Ответы

Ответ 1

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

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

См. также:

Ответ 2

Вы можете реализовать контекст и использовать @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/