1

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

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

我的豆子看起来像这样:

@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;
    }
}

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

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

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

编辑 我试图用:@RequestScoped@SessionScoped- 注释我的 bean 没有工作。同样的问题仍然存在。

4

1 回答 1

5

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

<application>
    <el-resolver>
        org.springframework.web.jsf.el.SpringBeanFacesELResolver
    </el-resolver>
</application>

但是这样做会失去@ViewScoped托管 bean 的功能。要解决这个错误,你必须@ViewScoped在 Spring 中实现。网上有很多关于这个的例子,看起来最受欢迎的是来自Cagatay's

有关 JSF 托管 bean 范围的更多信息:JSF 2 中的通信:托管 bean 范围

于 2013-06-24T14:58:15.757 回答