Упоминается также CDI-совместимый @ javax.faces.flow.ViewScoped. Это может быть интересно для некоторых.
у приложение 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";
}
Это, кажется, делает трюк. Однако теперь мой вопрос изменился. Где именно вы должны вызывать разговор. Конец ()? Должен ли я написать фильтр, чтобы определить, когда пользователь покидает страницу? Или, если оставить его в покое, только когдаAbean экземпляр будет разыменован?
ВТОРОЕ ОБНОВЛЕНИЕ: я нашел очень хорошее обсуждение @ConversationScoped CDIВот.
Я все еще остаюсь с проблемой того, как вызвать разговор. Конец (). Мой bean-компонент обеспечивает поддержку состояния с сохранением в браузере таблиц данных, обновленном через AJAX, и оптимальное место для вызова end () - это когда пользователь уходит со страницы. Несмотря на то, что я не написал фильтр для мониторинга страниц, я не вижу никакого способа сделать это. Любое предложение о "наилучшей практике" приветствуется.