Уничтожение области видимости beans при завершении сеанса

Мой вопрос связан с этим (и, возможно, с другими):

@PreDestroy никогда не вызывал @ViewScoped

Как уже было сказано, нет никакого тривиального решения для того, чтобы либо иметь видимую область видимости beans, разрушенную при навигации, и, похоже, это верно, если срок действия сеанса истекает.

Что бы мог предложить нетривиальный подход к выпуску (вызов метода @PreDestroy) JSF view-scoped beans или, более конкретно, по истечении срока действия сеанса?

Я использую Java EE 6 и Mojarra 2.1.x на GlassFish 3.1.2.

Ответ 1

Создайте @SessionScoped bean, чтобы удерживать ресурсы (в некоторой коллекции/массиве?) и вставлять их в @ViewScoped bean, а затем полагаться на @PreDestroy сеанса bean.

Правда, таким образом ресурсы живут немного дольше, чем вы хотите, но это самое простое и надежное решение, которое вы можете получить. Если вы хотите сохранить @PreDestroy в области видимости bean, вам нужно как-то убедиться, что конечный пользователь всегда выполняет навигацию по запросу HTTP POST именно в этом представлении с охватом bean. Вы не можете надежно гарантировать, что (компьютер конечного пользователя может упасть и т.д.).