2014-10-22 3 views
1

У меня есть @SessionScoped CDI beans. Раньше все они были управляемыми bean-файлами JSF (измененными с управляемых bean-блейдами JSF на управляемые bean-носители CDI).Удаление бобов с сеанса

Я выполнил следующие действия, чтобы удалить JSF с ограниченным сеансом, после того как пользователь успешно разместил онлайн-заказ.

Map<String, Object> sessionMap = context.getSessionMap(); 

sessionMap.remove("cartBean"); 
sessionMap.remove("orderItems"); 
sessionMap.remove("reviewOrderBean"); 
sessionMap.remove("intermediateLocaleBean"); 
sessionMap.remove("localeBean"); 
sessionMap.remove("currencyRateBean"); 
sessionMap.remove("currency"); 

Для того чтобы все было установлено по умолчанию после завершения обработки заказа. Это не имеет отношения к уничтожению/аннулированию всего сеанса HTTP, когда пользователь не должен выходить из системы после успешного завершения обработки заказа.


В отличие от JSF управляемых компонентов, КДИ бобы хранятся в памяти сервера некоторым КДИ реализации менеджера как Weld. Поэтому они недоступны на сеансовой карте - Map<String, Object>.

Как это можно моделировать в любом случае относительно CDI beans?


UPDATE:

The Weld documentation:

Имейте в виду, что когда-боб связан с контекстом, она остается в , что контекст, пока контекст не будет уничтожен. Невозможно удалить вручную из контекста. Если вы не хотите, чтобы bean-компонент сидел в сеансе на неопределенный срок, рассмотрите возможность использования другой области с сокращенным сроком действия , например, область запроса или разговора.

Таким образом, я предполагаю, что трудно вручную уничтожить компонент, не разрушая что-то еще.

ответ

3

CDI 1.1 представил интерфейс AlterableContext с методом destroy(Bean<T>).

Получить контекст сеанса через beanManager.getContext(SessionScoped.class), опустив до AlterableContext, а затем вызывается destroy() с соответствующим типом бобов.

Смежные вопросы