13

如何在过滤器中检索 FacesContext?

我关注了以下关于如何FacesContext在 a中检索的文章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 范围来保存一些数据和消息,这不起作用。

4

1 回答 1

23

如何在过滤器中检索 FacesContext?

你不能。由FacesContext来创建,FacesServlet因此只能在由 处理的任何 Java 代码中使用FacesServlet,它涵盖了所有 JSF 工件,例如托管 bean 和阶段侦听器。文章只展示了如何手动创建FacesContext,但这种方法最终是没有用的。这FacesContext只是标准 Servlet API 已经可用的所有内容的抽象,例如HttpServletRequestHttpSessionServletContext等。只需像 JSF 的“幕后操作”一样直接使用它们。

您有 2 个选项:

  1. 请改用 JSF PhaseListener。根据您没有说明的具体功能要求,这可能是一个相当笨拙的解决方案/解决方法。

  2. 不要使用 JSF 提供的 Flash 范围工具,而是自己自制一个。原理相当简单:在初始请求中设置 cookie,发送重定向,在重定向请求中查找 cookie并将其删除(以便在任何后续请求中不再存在)。这正是 JSF Flash 作用域的工作原理。另请参阅将通知消息设置为请求属性,该属性应在 sendRedirect 之后显示以获取具体示例。

于 2012-12-26T21:04:05.480 回答