В любых @ConversationScoped
бобах CDI у вас должно быть следующее поле:
@Inject
private Conversation conversation;
Если вы хотите начать диалог, вам нужно проверить, находится ли бин в состоянии transient
.В противном случае, IllegalStateException
будет брошено.Это будет что-то вроде этого:
public void beginConversation() {
if (conversation.isTransient()) conversation.begin();
}
При этом ваш бин будет в состоянии long-running
.Следовательно, если пользователь уходит со страницы и возвращается позже, вы всегда можете проверить, истекло ли время его разговора или нет, и перенести его на страницу, где он ушел.
Кроме того, я былиспользуя @ViewScoped
ManagedBean вместе с CDI bean некоторое время.Вы все еще можете использовать @Inject
для внедрения CDI bean в MangedBean .Я не думаю, что вы можете сделать наоборот.Во всяком случае, я понятия не имею, если это приведет к чему-то плохому случиться позже.Однако до сих пор я никогда не встречал никаких проблем.Если вы действительно хотите использовать @ViewScoped
, я думаю, вы можете попробовать: P.
ОБНОВЛЕНИЕ:
Является ли область разговора достойной заменойпосмотреть область в типичной ситуации AJAX?
Я не думаю, что @ConversationScoped
сможет когда-либо полностью заменить @ViewScoped
.
Как и область просмотра, позволяет ли онанесколько экземпляров за сеанс?
Нет, вы не можете иметь несколько экземпляров за сеанс.Как я уже говорил, если вы начнете новый разговор, пока старый разговор все еще находится в состоянии long-running
, вы получите IllegalStateException
.
Какие подводные камни?
Ну, одно из главных преимуществ @ViewScoped
перед @RequestScoped
заключается в том, что вам не нужно повторно инициировать данные каждый раз, когда пользователь отправляет форму в одно и то же представление.Однако с @ConversationScoped
это преимущество используется слишком часто.Хотя эта проблема не так серьезна, как если бы вы использовали @SessionScoped
, вам все равно нужно хранить инициализированные данные до тех пор, пока боб @ConversationScoped
живет.Чем дольше разговор, тем больше данных вам может понадобиться.