2012-06-25 66 views
2

我有一個請求範圍的JSF 1.2託管bean,我需要重構爲會話範圍的bean,因爲它在@PostConstruct上執行一些昂貴的操作,並且多次調用這真的只需要做一次。改變範圍,會議的副作用是,現在我不能做這樣的faces-config.xml注入FacesContext了:注入FacesContext作爲會話範圍的託管bean的託管屬性

<managed-property> 
<property-name>context</property-name> 
<value>#{facesContext}</value> 
</managed-property> 

在那裏我有

setContext(FacesContext ctx) {} 
在我管理的bean

在我的一個行動方法中,我需要上下文才能訪問ExternalContext/HttpServletResponse。我不想調用

FacesContext.getCurrentInstance(); 

我的操作方法裏面,但不知叫setContext(FacesContext ctx)外部允許範圍內注射的隔離,便於嘲笑測試。我試着把setContext()放在@PostConstruct之內,後來才知道FacesContext是一個請求,而我的ExternalContext被重置爲null,一旦有新的請求被提交。

雖然託管bean本身是會話作用域,但每次遇到新請求時我怎樣才能自動調用setContext(FacesContext ctx)

回答

1

保留您的請求作用域bean並在其中注入會話作用域bean,以便您可以將FacesContext傳遞給請求作用域bean的@PostConstruct中的它。在會話範圍的bean中,執行延遲加載/執行。

E.g.

public class RequestBean { 

    private FacesContext context; // Managed property. 
    private SessionBean sessionBean; // Managed property. 

    @PostConstruct 
    public void init() { 
     sessionBean.init(context); 
    } 

    // ... 
} 

public class SessionBean { 

    private SomeObject initializedObject; 

    public void init(FacesContext context) { 
     if (initializedObject != null) { 
      return; 
     } 

     initializedObject = initializeObject(context); 
    } 

    // ... 
} 
+0

是的,我結束了創建兩個獨立的託管bean像你提出解決問題。我之前苦苦掙扎,因爲我試圖融入單個託管bean。 – phewataal

+0

不客氣。在會話範圍的bean中注入'FacesContext'的唯一方法是使用CDI,但只有在使用Java EE 6時纔可用。在使用古老的JSF 1.2時,顯然完全沒有問題。 – BalusC

+0

你會怎麼做CDI? –