我有一个@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注释的混合。
答案 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