2010-12-23 85 views
5

我有一個bean,我最近從一個託管bean轉換成了一個spring-bean。將FacesContext注入Spring bean

一切順利,直到在某個點以下的方法被稱爲:

Exception e = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(
        AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 

在這一點上的東西炸掉,因爲FacesContext.getCurrentInstance()返回null。

是有可能注入faces上下文到我的豆?

+0

只是作爲背景:如果`FacesContext.getCurrentInstance()`返回null,則該呼叫可能被JSF生命週期外進行(之前上下文已經被初始化,在它被銷燬之後或者在不同的線程中)。 `FacesContext`實例的每個請求範圍都保存在一個`ThreadLocal`變量中。 – McDowell 2010-12-23 14:14:22

回答

6

是有可能注入faces上下文到我的豆?

不知道,但在這個特殊的情況下,它是沒有必要的。 ExternalContext#getSessionMap()基本上是HttpSession屬性的外觀。至此,您只需要以某種方式獲取Spring bean中的HttpServletRequest,然後通過HttpServletRequest#getSession()獲取HttpSession。然後您可以通過HttpSession#getAttribute()訪問會話屬性。

我不做春天,但Google得知我,你如下可以得到它:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 

一旦做到這一點,你可以這樣做:

Exception e = (Exception) request.getSession().getAttribute(AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY); 
+0

你的諮詢率是多少?另外,你知道我如何獲得託管bean,他們是否在會話中? – mkoryak 2010-12-23 04:22:13

+2

就這樣,我很高興通過投票和綠色標記。至於託管bean,它們作爲`HttpServletRequest`(請求範圍),`HttpSession`(會話範圍)和`ServletContext`(應用範圍)的屬性以及它們的託管bean名稱作爲關鍵字存儲。你知道,JSF(和Spring)只是運行在「原始」Servlet API之上。 – BalusC 2010-12-23 04:25:15

6

我所面臨的確切今天同樣的問題,所以我想發佈這個答案供將來參考。

FacesContext中可以使用注射:

@ManagedProperty("#{facesContext}") 
FacesContext faces; 

它適用於春豆也提供Spring和JSF的應用程序中的適當整合。

參考:

Integrating Spring and JSF

Injecting FacesContext