Jsf 2 为每个请求创建JSF2会话bean

Jsf 2 为每个请求创建JSF2会话bean,jsf-2,Jsf 2,埃洛 我有两个托管bean,一个视图作用域,另一个会话作用域。视图范围的bean定义为 @ManagedBean @ViewScoped public class InvoiceController implements Serializable { private static final long serialVersionUID = 1L; @ManagedProperty(value="#{invoiceService}") private InvoiceService i

埃洛

我有两个托管bean,一个视图作用域,另一个会话作用域。视图范围的bean定义为

@ManagedBean
@ViewScoped
public class InvoiceController implements Serializable {
  private static final long serialVersionUID = 1L;

  @ManagedProperty(value="#{invoiceService}")
  private InvoiceService invoiceService;
会话作用域bean为

@ManagedBean
@SessionScoped
public class InvoiceService implements Serializable{
我使用会话作用域bean来保存一个标志,该标志用于决定是否应该呈现一个面板,当我在调试过程中运行该标志时,我发现每次在sesison bean上调用该方法时,它都是该bean的一个新实例,因此在请求之间不会保留我的标志值


我做错了什么?

如果您从包而不是从包导入了
@SessionScoped
,可能会发生这种情况。前者仅适用于CDIBeans,而后者仅适用于JSF bean


没有任何有效作用域的JSF
@ManagedBean
将默认为,这意味着它是在引用bean的每个EL表达式上新构造的,例如。这就解释了你看到的症状。

我也有类似的问题。我在视图范围bean中使用一个save方法,该方法调用会话范围bean中的一个方法来更新一些值

这是我通过调试发现的(请原谅我的非Java大师英语):

当第一次加载页面时,注入会话bean的实例号是例如111111。 但是在save方法中(以及由commandButton或action侦听器之类的操作调用的所有其他方法),会话bean突然变成了另一个实例(比如2222)

实例111111和2222222都包含非常相同的值。 我现在调用的所有方法都是在2222222实例中完成的,它根据我的需要更改了其中的值。但111111事件仍然没有发生变化

所以22222基本上是111111的深层克隆,甚至不是拷贝

但是,在save方法完成并重新加载页面之后,视图范围bean中再次使用了原来的111111实例。 22222实例刚刚被扔进垃圾箱

我对此问题的解决方案:

我不再使用ManagedProperty注入

相反,我编写了一些帮助程序代码,以便在需要会话bean的地方获取会话bean(在视图范围的bean方法中也称为):

对于上面的示例,调用将是:

InvoiceService=(InvoiceService)helper.getSessionBean(“InvoiceService”)

在方法中调用它,不要将其存储为视图范围bean中的字段


我希望这能帮助您解决问题。

谢谢BalusC,我已经检查了导入,它是javax.faces.bean包。然后您就遇到了更大的问题。您的视图范围bean是否也被重新创建或维护?您使用的是服务器端状态保存还是客户端状态保存?会话cookie是否在后续请求中得到正确维护?哇,这就是我尝试执行简单操作的时候。我会查的-谢谢
public Object getSessionBean(String sessionBeanName)
    {
        return FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, sessionBeanName);
    }