来自@RequestScoped bean的数据在不同的浏览器中共享

时间:2012-05-07 13:39:40

标签: spring jsf scope managed-bean

我有一个@RequestScoped bean,其List属性。

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.springframework.stereotype.Controller;

@Controller
@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    private List list;

    // getters and setters
}

此属性链接到数据表:

<ice:dataTable value="#{myBean.list}" ..other stuff.. />

List动态填充没有问题,数据表显示没有问题。但是,如果,我导航到另一个页面,然后返回到初始页面,数据表仍然包含初始请求的数据。它应该不再是空的?如果bean是请求范围的,那么它应该在请求之后被销毁,我应该把数据空间作为开头。

更奇怪的是,如果我在一个浏览器(如Firefox)中打开页面,请填写数据表请求,然后我打开另一个浏览器(如Chrome)并转到数据表页面,它充满了数据来自其他浏览器的先前请求!我认为bean的行为类似于应用程序。

有什么想法吗?


更新1 :该类的变量不是静态的。另外,我禁用了tomcat缓存,但仍无效。

更新2 :我想可能发现了问题。我的支持bean使用Spring中的@Controller进行注释。我使用此批注,因为然后使用@Autowired来绑定服务。可能这是创建一个单例,为什么不是每次请求都创建和销毁?我认为问题在于Spring和JSF2注释的混合。

1 个答案:

答案 0 :(得分:4)

您不应该通过JSF,CDI和Spring等多个不同的bean管理框架来管理单个bean。选择其中一个。当通过例如Spring @Controller管理bean时,所有与bean管理相关的其他框架的注释,如JSF&#39; @ManagedBean和CDI&#39; @Named <强>忽略

我不做Spring而且我不知道你为什么要使用它而不是标准的Java EE 6 API,但症状和文档表明这样的Spring bean的范围确实默认为适用范围。您需要通过Spring @Scope注释指定bean范围。您还希望删除JSF bean管理注释,因为它们不再具有任何价值,并且只会混淆开发人员/维护者。

@Controller
@Scope("request")
public class MyBean implements Serializable {
    // ...
}

或者,您也可以删除Spring @Controller注释并坚持使用JSF @ManagedBean。您可以使用@ManagedProperty而不是@Autowired来注入另一个@ManagedBean实例,甚至是Spring托管bean(如果配置了Spring Faces EL解析器),或Java EE标准{{1}注入@EJB@Stateless实例。

E.g。

@Stateful

另见: