Bean属性在不同的会话中共享

use*_*247 1 jsf spring primefaces

我在我的应用程序中使用JSF Mojarra 2.1.13,PrimeFaces 3.5和Spring 3.2.3.对于DI我使用的是Spring方法(不是CDI).我正在跟踪有关收集器的PrimeFaces演示教程:http://www.primefaces.org/showcase/ui/collector.jsf

一切都工作正常,我可以将我的值添加到列表,获取它们等.问题是,例如,如果我打开两个浏览器并将一些值添加到列表中,然后在另一个浏览器中我添加一些值作为好吧,如果我刷新浏览器,我会看到在两个浏览器中输入的所有值.因此,如果我在另一个浏览器中输入两个值,则在刷新它们之后,我会在两个浏览器中看到四个值.我希望我的价值观不会在不同的会话中分享.

我的bean看起来像这样:

@Component
@ManagedBean
public class ClientBean extends BaseBean {

    private Client client = new Client();

    private List<Client> clients = new LinkedList<>();

    public String reInit() {
        client = new Client();
        return null;
    }

    public Client getClient() {
        return client;
    }

    public void setClient(Client client) {
        this.client = client;
    }

    public List<Client> getClients() {
        return clients;
    }

    public void setClients(List<Client> clients) {
        this.clients = clients;
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我正在创建全局变量:

private Client client = new Client();    
private List<Client> clients = new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

但这在教程中显示.那么我该如何处理这种情况以使收集器工作,以便这些变量不会在不同的会话中共享?

编辑 我试图用以下方法注释我的bean:@RequestScoped或者@SessionScoped- 没有用.同样的问题仍然存在.

Lui*_*oza 5

不确定为什么你配置@ManagedBean为a @Component开始.这个问题是因为Spring处理@Component整个应用程序的单个实例(或者至少从你的解释中看它的样子).删除它并@ViewScoped在托管bean中使用以使其按预期工作.请注意,如果您使用Spring来管理JSF托管bean,那么您必须在faces-config.xml中添加此配置(来自mkyong教程):

<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>
Run Code Online (Sandbox Code Playgroud)

但这样做会损失@ViewScoped托管bean的功能.要解决此错误,您必须@ViewScoped在Spring中实现.网上有很多关于此的例子,看起来最流行的是来自Cagatay的

有关JSF托管bean作用域的更多信息:JSF 2中的通信:托管bean作用域