如何在过滤器中检索FacesContext

djm*_*jmj 12 jsf facescontext servlet-filters flash-scope

如何在过滤器中检索FacesContext?

我跟着就如何检索下面的文章FacesContextFilter:

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)
Run Code Online (Sandbox Code Playgroud)

我想在我的过滤器中添加重定向并使用闪存范围来保存一些数据以及消息,这是无效的.

Bal*_*usC 21

如何在过滤器中检索FacesContext?

你不能.它FacesContext由the创建FacesServlet,因此仅在由其处理的任何Java代码中可用FacesServlet,其涵盖所有JSF工件,例如托管bean和阶段侦听器.本文仅介绍如何手动创建FacesContext,但这种方法最终无用.该FacesContext只是一切都已经可以通过标准的Servlet API的如的抽象HttpServletRequest,HttpSession,ServletContext等只需使用他们的直接方式与JSF同样是"下罩"做.

你有2个选择:

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

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