2010-12-23 64 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