2012-08-09 88 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中。

我希望這能以某種方式幫助您解決您的問題。

相關問題