Разрешено ли использовать @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, однажды мне понадобилось время, чтобы найти проблему.
Есть хороший пример.