从@RequestScoped豆数据是在不同的浏览器共享(Data from @RequestSco

2019-06-24 05:16发布

我有一个@RequestScoped豆与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.. />

这份名单是动态的充满了没有问题,而数据表显示,没有任何问题。 但是,如果我导航到另一个页面,然后回到初始页面的数据表仍与初始请求的数据。 它不应该再是空的? 如果bean是请求范围应请求后销毁了,我应该得到和空数据表为起点。

更为奇怪的是,如果我在一个浏览器(如Firefox)打开网页,填写数据表一个请求,然后我打开另一个浏览器(如Chrome)并转到数据表页面,它充满了从之前的请求数据从其他浏览器! 我觉得这个bean的行为就像一个应用程序之一。

有任何想法吗?


更新1:类也不是一成不变的既不它的变量。 另外,我的tomcat禁用缓存,但仍然没有工作。

更新2:我想大概是发现了问题。 我的支持豆标注有@Controller从春天。 我使用此批注,因为再使用@Autowired绑定服务。 可能是这是建立一个独立的,并没有正在创建的每个请求销毁为什么呢? 我觉得很确定这个问题是在春季和JSF2注释的组合。

Answer 1:

你不应该管理由像JSF,CDI和Spring多个不同的bean管理框架的一个bean。 选择一个或另一个。 当管理由例如Spring的bean的@Controller ,像JSF的其他框架中所有的bean管理相关的注解@ManagedBean和CDI的@Named忽略

我不这样做春,我不知道你用它来代替标准的Java EE 6 API的原因,但症状和文件表明,这样一个Spring bean确实默认应用范围的范围。 您需要指定由Spring bean的范围@Scope注解。 你也想,因为他们没有任何价值了呢,只会混淆开发者/维护者删除JSF的bean管理注释。

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

或者,你也可以摆脱春@Controller注释和坚持JSF @ManagedBean 。 您可以使用@ManagedProperty而不是@Autowired注入另一@ManagedBean实例,甚至是Spring管理的bean(如果你有春天面临配置EL解析器),或Java EE标准@EJB注入的@Stateless@Stateful实例。

@ManagedBean
@RequestScoped
public class MyBean implements Serializable {

    @EJB
    private SomeService service;

    // ...
}

也可以看看:

  • 春天JSF集成:如何注入一个Spring组件/服务在JSF管理的bean?


文章来源: Data from @RequestScoped bean is shared in different browsers