如何在过滤器中检索FacesContext

时间:2012-12-26 19:27:20

标签: jsf servlet-filters facescontext flash-scope

如何在过滤器中检索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范围来保存一些数据以及不能正常工作的消息。

1 个答案:

答案 0 :(得分:21)

  

如何在过滤器中检索FacesContext?

你做不到。 FacesContextFacesServlet创建,因此仅在由FacesServlet处理的任何Java代码中可用,其涵盖所有JSF工件,例如托管bean和阶段侦听器。本文仅介绍如何手动创建FacesContext,但这种方法最终无用。 FacesContext只是标准Servlet API已经提供的所有内容的抽象,例如HttpServletRequestHttpSessionServletContext等。直接使用它们的方式与JSF相同做“引擎盖下”。

您有两个选择:

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

  2. 不要使用JSF提供的Flash范围工具,而是自己自制。原理相当简单:在初始请求上设置cookie,发送重定向,在重定向的请求查找中,cookie 将其删除(以便在任何后续请求中不再存在)。这正是JSF Flash范围的工作原理。另请参阅Set notification message as request attribute which should show after sendRedirect以获取具体示例。