如何在过滤器中检索 FacesContext?
我关注了以下有关如何在Filter
中检索FacesContext
的文章:
http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/
但问题是它不适用于闪存范围。抛出以下 NPE:
java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:751)
at com.sun.faces.context.flash.ELFlash.getPhaseMapForWriting(ELFlash.java:785)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:392)
at com.sun.faces.context.flash.ELFlash.put(ELFlash.java:112)
我想在我的过滤器中添加重定向并使用闪存范围来保存一些数据和消息,这不起作用。
如何在过滤器中检索 FacesContext?
你不能。FacesContext
由FacesServlet
创建,因此仅在由FacesServlet
处理的任何Java代码中可用,该代码涵盖了所有JSF工件,例如托管bean和阶段侦听器。本文仅展示了如何手动创建FacesContext
,但这种方法最终是无用的。FacesContext
只是标准 Servlet API 已经提供的所有内容的抽象,例如HttpServletRequest
、HttpSession
、ServletContext
等。只需像 JSF 在"引擎盖下"一样直接使用它们。
您有 2 个选项:
-
请改用 JSF
PhaseListener
。根据您没有告诉任何内容的具体功能要求,这可能是一个相当笨拙的解决方案/解决方法。 -
不要使用 JSF 提供的 Flash 示波器工具,而是自己自制一个。原理相当简单:在初始请求时设置一个cookie,发送重定向,在重定向的请求中查找cookie并将其删除(以便在任何后续请求中不再存在)。这正是 JSF 闪存示波器在引擎盖下的工作方式。另请参阅将通知消息设置为请求属性,该属性应在发送重定向后显示,以获取具体示例。