将FacesContext注入spring bean

mko*_*yak 5 java jsf spring

我有一个bean,我最近从一个托管bean转变为一个spring-bean.

一切都很好,直到某个时候调用以下方法:

Exception e = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(
                    AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY);
Run Code Online (Sandbox Code Playgroud)

在这一点上事情爆发,因为FacesContext.getCurrentInstance()返回null.

是否可以将faces上下文注入我的bean?

coo*_*ist 7

我今天遇到了完全相同的问题,所以我想发布这个答案以供将来参考.

可以使用以下方式注入FacesContext:

@ManagedProperty("#{facesContext}")
FacesContext faces;
Run Code Online (Sandbox Code Playgroud)

如果Spring和JSF在应用程序中正确集成,它也适用于spring bean.

参考:

集成Spring和JSF

注入FacesContext


Bal*_*usC 6

是否可以将faces上下文注入我的bean?

不确定,但在这种特殊情况下,它不需要.该ExternalContext#getSessionMap()基本上是一个门面的属性HttpSession.到了这一步,你只需要以HttpServletRequest某种方式抓住你的Spring bean,然后从中获取HttpSessionHttpServletRequest#getSession().然后,您可以通过访问会话属性HttpSession#getAttribute().

我不做Spring,但Google告诉我你可以按如下方式获得它:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
Run Code Online (Sandbox Code Playgroud)

完成后,您可以这样做:

Exception e = (Exception) request.getSession().getAttribute(AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY);
Run Code Online (Sandbox Code Playgroud)

  • 在SO,我很高兴投票和绿色标记.对于托管bean,它们被存储为`HttpServletRequest`(请求范围),`HttpSession`(会话范围)和`ServletContext`(应用程序范围)的属性以及它们的托管bean名称作为键.你知道,JSF(和Spring)只运行在"原始"Servlet API之上. (2认同)