Разрешено ли использовать @Stateful и @javax.faces.view.ViewScoped вместе?

Я понимаю, что

@Stateful
@ConversationScoped 

разрешено и является нормальным использованием.

С новой аннотацией JSF 2.2 ViewScoped (javax.faces.view.ViewScoped), которая задокументирована как полностью совместимая с аннотациями области действия CDI, означает ли это, что:

@Stateful
@ViewScoped

Является ли жизнеспособная комбинация?

2 ответа

Имейте в виду, что с @stateful каждый раз, когда вы внедряете его, вы получаете новый конкретный экземпляр, потому что вы указываете сохранение состояния с помощью этой аннотации. Кроме того, концепция сеанса на уровне EJB не совпадает с концепцией сеанса на уровне JSF, и путаница между ними может создать для вас всевозможные проблемы.

Сеанс JSF привязан к конкретному клиенту, поддерживаемому с помощью cookie или перезаписи URL (конфигурация контейнера).

Сеанс EJB привязан к конкретному выполнению метода (@Stateless) или конкретному экземпляру (@Stateful).

если вам не нужно иметь надежную сериализацию и поддержание состояния в EJB, Stateful не даст вам того, чего вы хотите. Лучше всего будет разделить транзакционные аспекты в @Stateless и сохранить ваше состояние в @ViewScoped, который передается в методы @Stateless.

@Stateful - это аннотация EJB, так что технически ваш bean-компонент будет EJB-компонентом с состоянием, а не CDI-компонентом. И это будет работать только на полном сервере приложений. В случае (только) использования JSF 2.2 + CDI:

@javax.inject.Named // to expose a bean in the EL context  
@javax.faces.view.ViewScoped // to make it view scoped

Также не путайте последнюю аннотацию с @ javax.faces.bean.ViewScoped, однажды мне понадобилось время, чтобы найти проблему.
Есть хороший пример.

Другие вопросы по тегам