jsf 2为每个请求创建的会话bean

时间:2012-08-09 16:33:56

标签: jsf-2

ELLO

我有2个托管bean,一个是作用域,另一个是作用域。 View作用域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,因此不会在请求之间保留我的标志值。

我做错了什么?

2 个答案:

答案 0 :(得分:7)

如果您从javax.enterprise.context包而不是javax.faces.bean包中导入@SessionScoped,就会发生这种情况。前者仅适用于CDI @Named bean,而后者仅适用于JSF @ManagedBean bean。

没有任何有效范围的JSF @ManagedBean将默认为@NoneScoped,这意味着它是在引用该bean的每个EL表达式上新构建的,例如@ManagedProperty。这解释了您所看到的症状。

答案 1 :(得分:0)

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

这是我通过调试找到的(请原谅我的非Java-guru英语):

首次加载页面时,注入的会话bean的实例编号为例如111111。 但是在save-method(以及像commandButton或动作监听器btw这样的动作调用的所有其他方法)中,会话bean突然变成另一个实例(比如222222)。

实例111111和222222都包含非常相同的值。 我现在调用的所有方法都是在222222实例中完成的,它根据需要在那里更改了值。但是111111的情况仍然没有改变。

所以222222基本上是111111的深(?)克隆,甚至不是副本。

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

我解决此问题的方法:

我不再使用ManagedProperty注射了。

相反,我做了一些帮助代码来获取会话bean,无论我需要它(也就是在视图范围内的bean方法中):

public Object getSessionBean(String sessionBeanName)
    {
        return FacesContext.getCurrentInstance().getApplication().getELResolver().getValue(FacesContext.getCurrentInstance().getELContext(), null, sessionBeanName);
    }

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

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

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

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