Я пишу приложение 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() - это когда пользователь переходит от страницы. Однако, нечаянно записывая фильтр для мониторинга страниц, я действительно не вижу никакого способа сделать это. Любое предложение "наилучшей практики" приветствуется.