我有一個請求範圍的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)
?
是的,我結束了創建兩個獨立的託管bean像你提出解決問題。我之前苦苦掙扎,因爲我試圖融入單個託管bean。 – phewataal
不客氣。在會話範圍的bean中注入'FacesContext'的唯一方法是使用CDI,但只有在使用Java EE 6時纔可用。在使用古老的JSF 1.2時,顯然完全沒有問題。 – BalusC
你會怎麼做CDI? –