JSF SessionScoped managedBean与ViewScoped managedBean结合使用
我的项目中存在以下问题: 我们有2个具有以下配置的托管bean:JSF SessionScoped managedBean与ViewScoped managedBean结合使用,jsf,null,managed-bean,session-scope,Jsf,Null,Managed Bean,Session Scope,我的项目中存在以下问题: 我们有2个具有以下配置的托管bean: @ManagedBean @SessionScoped public class SessionBean { private PersonnelFile personnelFile; // + getters/setters } @ManagedBean @ViewScoped public class ViewBean { @ManagedProperty("#{sessionBean}") priva
@ManagedBean
@SessionScoped
public class SessionBean {
private PersonnelFile personnelFile; // + getters/setters
}
@ManagedBean
@ViewScoped
public class ViewBean {
@ManagedProperty("#{sessionBean}")
private SessionBean sessionBean;
public void selectPersonnel() {
sessionBean.getPersonnelFile().setPerson(new Person());
}
}
这不是全部代码,但它让您大致了解情况:
持有会话对象的SessionScoped bean
ViewScoped bean,其中包含与视图相关的对象和对SessionScoped bean的引用
现在的问题是:
我访问我的视图
我对同一个视图做了几次回帖,每次都会回到视图。。到现在为止,一直都还不错
在某一时刻,我在SessionScoped bean中使用视图中的信息设置会话对象,然后离开视图。。。到现在为止,一直都还不错
现在,当我返回到这个视图时,他按照预期创建了一个新的ViewScoped bean实例,并由于ManagedProperty注释将SessionScoped bean设置回原处
当我调试它时,我可以看到对SessionScoped bean的引用保持不变,因此它是同一个对象
然而,我之前在SessionScoped bean中设置的对象已经变为null,这意味着他“丢失”了关于该对象的会话信息
我从来没有在SessionScoped bean中重置这个对象,所以我看不出它可能出了什么问题。。。
如果你想要更多的解释或如果你想让我更好地表达这个问题,请告诉我或使用编辑按钮 @BalusC
我想我们可能已经发现了问题所在。在web.xml中,我们使用了以下设置:
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
现在,如果我理解正确的话,我们无法通过具有此设置的视图范围bean编辑会话范围bean的状态。。。我们能够更改会话范围bean的状态的唯一方法是在bean本身的构造函数或后构造函数方法中。从视图范围bean内部对会话范围bean所做的更改未在服务器上持久化
如果我们将此变量设置为“server”,则状态确实会保留在服务器上,而不是每次都传输到客户端。我知道这会在内存方面增加服务器的负载,但我想知道如何使用客户端方法解决问题
因此,我的问题已经解决,但我不确定解决方案是否理想…我从未在SessionScoped bean中重置此对象。代码中肯定有什么东西改变了属性。没有魔法。根据目前提供的信息,我们无法指出任何潜在的原因。您需要在私人上设置一个可变的监视断点;调试器中的行。然后你可以检查试图改变它的堆栈。我想我们可能已经发现了问题。在我们的web.xml中,我们使用了以下设置:javax.faces.STATE\u SAVING\u METHOD server Hmm,您使用的是哪个JSF impl/版本?