如何在过滤器中检索FacesContext?
我按照以下文章介绍了如何检索FacesContext
中的Filter
:
http://ocpsoft.org/java/jsf-java/jsf-20-extension-development-accessing-facescontext-in-a-filter/
但问题是它无法使用Flash范围。关注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)
我想在我的过滤器中添加重定向,并使用flash范围来保存一些数据以及不能正常工作的消息。
答案 0 :(得分:21)
如何在过滤器中检索FacesContext?
你做不到。 FacesContext
由FacesServlet
创建,因此仅在由FacesServlet
处理的任何Java代码中可用,其涵盖所有JSF工件,例如托管bean和阶段侦听器。本文仅介绍如何手动创建FacesContext
,但这种方法最终无用。 FacesContext
只是标准Servlet API已经提供的所有内容的抽象,例如HttpServletRequest
,HttpSession
,ServletContext
等。直接使用它们的方式与JSF相同做“引擎盖下”。
您有两个选择:
请改用JSF PhaseListener
。根据您没有说明的具体功能要求,这可能是一个相当笨拙的解决方案/解决方法。
不要使用JSF提供的Flash范围工具,而是自己自制。原理相当简单:在初始请求上设置cookie,发送重定向,在重定向的请求查找中,cookie 和将其删除(以便在任何后续请求中不再存在)。这正是JSF Flash范围的工作原理。另请参阅Set notification message as request attribute which should show after sendRedirect以获取具体示例。