是否允许使用@Stateful和@javax.faces.view ?ViewScoped在一起



我的理解是

@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方法。

相关内容

  • 没有找到相关文章

最新更新