2012-08-09 64 views
1

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

我有2个托管bean,一个View范围,另一个Session范围。查看范围的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的新实例,因此不会在请求之间保留我的标志值。

我在做什么错?

回答

7

如果您已经从javax.enterprise.context包,而不是从javax.faces.bean包进口@SessionScoped可能发生。前者仅在CDI @Named豆上工作,而后者仅在JSF @ManagedBean豆上工作。

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

+0

感谢BalusC,我检查了导入,它是javax.faces.bean包。 – MGB 2012-08-09 20:18:39

+0

然后你遇到了更大的问题。您的视图范围的bean是否也被重新创建或维护?您是否正在使用服务器或客户端状态保存?会话cookie是否在后续请求中得到适当维护? – BalusC 2012-08-09 20:23:28

+0

哇,这是当我试图做简单的位。我会检查 - 谢谢 – MGB 2012-08-09 21:13:10

0

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

这是我发现的调试(原谅我的非Java导师英文):

当第一次加载页面,注入会话bean的实例数量例如111111 但在save-method(以及所有其他方法(如commandButton或action listeners btw)所调用的所有其他方法),突然间会话bean是另一个实例(如222222)。

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

所以222222基本上是一个111111的深度(?)克隆,甚至没有副本。

但是,保存方法完成并重新加载页面后,原始111111实例再次在视图范围bean中使用。 222222实例刚投入垃圾。

我对这个问题的解决方案:

我不使用ManagedProperty注入了

相反,我做了一些辅助代码来获取会话bean,无论我需要它(又名视图范围的bean的方法):

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

对于你上面的例子中,调用将是:

InvoiceService invoiceService =(InvoiceService)助手。getSessionBean( “invoiceService”);

在你的方法中调用它,不要将它作为一个字段存储在视图范围的bean中。

我希望这能以某种方式帮助您解决您的问题。

相关问题