我的理解是
@Stateful
@ConversationScoped
是允许的,并且是正常使用。
对于新的JSF 2.2 ViewScoped (javax.faces.view.ViewScoped)注释,它被记录为与CDI范围注释完全兼容,这是否意味着:
@Stateful
@ViewScoped
是可行的组合吗?
@Stateful是一个EJB注释,因此从技术上讲,您的bean将是一个有状态的EJB bean,而不是CDI bean。而且它只能在成熟的应用服务器中工作。如果(仅)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混淆。我曾经花了一段时间才找到这个问题。
这里有一个很好的例子
请记住,使用@stateful,每次注入它时都将获得一个新的具体实例,因为您使用该注释指示存储状态。此外,EJB层的会话概念与JSF层的会话概念也不相同,混淆这两者可能会给您带来各种各样的问题。
JSF会话绑定到由cookie或url重写(容器配置)维护的特定客户端。
EJB会话绑定到特定的方法执行(@Stateless)或具体的实例(@Stateful)。
除非在EJB中需要持久的序列化和状态维护,否则有状态不会给你想要的东西。最好的办法是将事务方面分离为@Stateless,并将状态存储在@ViewScoped中,该@ViewScoped将传递给@Stateless方法。