1

我的项目中有以下问题:

我们有 2 个托管 bean,配置如下:

@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 实例(如预期的那样)并将 SessionScoped bean 设置回来(因为 ManagedProperty 注释)
  • 当我调试它时,我可以看到对 SessionScoped bean 的引用保持不变,所以它是同一个对象
  • 但是,我之前在 SessionScoped bean 中设置的对象变成了null,这意味着他“丢失”了有关该对象的会话信息
  • 我从来没有在 SessionScoped bean 中重置这个对象,所以我看不出它哪里出了问题......

如果您需要更多解释或希望我更好地表达这个问题,请告诉我或使用编辑按钮!

4

1 回答 1

0

@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 本身的构造函数或 PostConstruct 方法中。从视图范围 bean 内部对会话范围 bean 所做的更改不会保留在服务器上。

如果我们将此变量设置为“服务器”,则状态确实会持久保存在服务器上,并且不会每次都传输到客户端。我知道这会在内存方面给服务器带来更多负载,但我想知道我们如何通过使用这种client方法来解决我们的问题。

所以,我的问题已解决,但我不确定解决方案是否理想......

于 2012-01-11T08:29:00.543 回答