是否允许同时使用@Stateful和@ javax.faces.view.ViewScoped?

时间:2014-03-11 08:24:55

标签: java jsf cdi jsf-2.2 ejb-3.2

我的理解是

@Stateful
@ConversationScoped 

是允许的,并且是正常使用。

使用新的JSF 2.2 ViewScoped(javax.faces.view.ViewScoped)注释,记录为与CDI范围注释完全兼容,这是否意味着:

@Stateful
@ViewScoped

是否可行?

2 个答案:

答案 0 :(得分:0)

@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 .ViewScoped,它曾经花了我一段时间才找到问题。
There's a nice example.

答案 1 :(得分:0)

请记住,对于@stateful,每次注入它都会得到一个新的具体实例,因为你指的是用该注释存储状态。会话的EJB层概念与会话的JSF层概念不同,两者混淆可能会为您创建各种问题。

JSF会话绑定到由cookie或URL重写(容器配置)维护的特定客户端。

EJB会话与特定方法执行(@Stateless)或具体实例(@Stateful)相关联。

除非您需要在EJB中进行持久的序列化和状态维护,否则有状态不会让您想要。你最好的选择是将事务方面分成@Stateless,并将你的状态存储在一个传递给@Stateless方法的@ViewScoped中。