Подтвердить что ты не робот

Как использовать @ConversationScoped

Я пишу приложение JSF 2.0, и я хочу использовать аннотации CDI вместо "эквивалентных" аннотаций JSF. Другими словами, @Model или @Named вместо @ManagedBean и @Inject вместо @ManagedProperty.

Единственное, что я не могу получить, это @ViewScoped, который необходим для компонентов AJAX. Единственная надежная работа - использовать @SessionScoped, что не является хорошей практикой.

Какова правильная практика? Насколько я ищу, я просто становлюсь более смущенным.

Это на GlassFish 3.1.1, который, как я понимаю, содержит Weld 1.1.0.

ОБНОВЛЕНИЕ: В исходной форме этого вопроса говорилось, что я не мог заставить @ConversationScoped работать. С тех пор я нашел свою ошибку, и я заставил ее работать так:

@Model
@ConversationScoped
public class Abean implements Serializable {

@Inject Conversation conversation;

// stuff omitted for brevity

public String getSomething() {
    if (conversation.isTransient()) conversation.begin();
    return "something";
}

Это похоже на трюк. Однако теперь мой вопрос изменился. Где именно вы должны позвонить talk.end()? Должен ли я писать фильтр для обнаружения, когда пользователь покидает страницу? Или, если он оставлен в покое, как раз, когда экземпляр Abean будет отменен?

ВТОРОЕ ОБНОВЛЕНИЕ: очень хорошее обсуждение CDI @ConversationScoped. Я нашел здесь.

Мне все еще остается проблема с вызовом dialog.end(). Мой bean обеспечивает поддержку состояния для браузера таблицы данных, обновленного через AJAX, и оптимальное место для вызова end() - это когда пользователь переходит от страницы. Однако, нечаянно записывая фильтр для мониторинга страниц, я действительно не вижу никакого способа сделать это. Любое предложение "наилучшей практики" приветствуется.

4b9b3361

Ответ 1

Этот путь проще с областями (CDI) MyDaces CODI. У них лучше @ConversationScoped, и вы будете любить @ViewAccessScoped за то, что вы пытаетесь.