我正在为我的应用程序使用JSF Mojarra 2.1.13,PrimeFaces 3.5和Spring 3.2.3。对于DI我使用的是Spring方法(不是CDI)。我正在使用收集器http://www.primefaces.org/showcase/ui/collector.jsf
关注PrimeFaces演示的教程一切正常,我可以将我的值添加到列表中,获取它们等等。问题在于,例如如果我打开两个浏览器并在列表中添加一些值,那么在另一个浏览器中我也会添加一些值,如果我刷新浏览器,我会看到在两个浏览器中输入的所有值。因此,如果我在另一个浏览器中输入两个值,则在刷新它们之后,我会在两个浏览器中看到四个值。我希望我的价值观不会在不同的会话中分享。
我的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;
}
}
我知道我正在创建全局变量:
private Client client = new Client();
private List<Client> clients = new LinkedList<>();
但这在教程中有所体现。那么我该如何处理这种情况以使收集器工作,以便这些变量不会在不同的会话中共享?
修改
我试图用@RequestScoped
或@SessionScoped
注释我的bean - 没有用。同样的问题仍然存在。
答案 0 :(得分:5)
不确定为什么要将@ManagedBean
配置为@Component
开头。这个问题是因为Spring在您的应用程序中处理@Component
的单个实例(或者至少从您的解释中看起来是这样的)。删除它并在托管bean中使用@ViewScoped
以使其按预期工作。请注意,如果您使用Spring来管理JSF托管bean,那么您必须在 faces-config.xml (来自mkyong tutorial)中添加此配置:
<application>
<el-resolver>
org.springframework.web.jsf.el.SpringBeanFacesELResolver
</el-resolver>
</application>
但是这样做会损失@ViewScoped
托管bean的功能。要解决此错误,您必须在Spring中实现@ViewScoped
。网上有很多关于此的例子,看起来最流行的是来自Cagatay's
有关JSF托管bean范围的更多信息:Communication in JSF 2: Managed bean scopes