我最近将bean从托管bean转换为spring-bean。
一切都很好,直到某个时候调用以下方法:
Exception e = (Exception) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(
AbstractProcessingFilter.SPRING_SECURITY_LAST_EXCEPTION_KEY);
此时事情爆发,因为FacesContext.getCurrentInstance()
返回null。
是否可以将faces上下文注入我的bean?
答案 0 :(得分:7)
我今天遇到了同样的问题,所以我想发布这个答案以供将来参考。
可以使用以下方式注入FacesContext:
@ManagedProperty("#{facesContext}")
FacesContext faces;
它也适用于spring bean,只要Spring和JSF在应用程序中正确集成。
参考:
答案 1 :(得分:6)
是否可以将faces上下文注入我的bean?
不确定,但在这种特殊情况下不需要它。 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);