Подтвердить что ты не робот

Как получить FacesContext в фильтре

Как получить 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)

Я хочу добавить перенаправление в свой фильтр и использовать флэш-область для сохранения некоторых данных, а также сообщений, которые не работают.

4b9b3361

Ответ 1

Как получить FacesContext в фильтре?

Вы не можете. FacesContext создается FacesServlet и поэтому доступен только в любом Java-коде, который обрабатывается FacesServlet, который охватывает все артефакты JSF, такие как управляемые beans и фазовые прослушиватели. В статье показано, как вручную создать FacesContext, но этот подход в конечном итоге бесполезен. FacesContext - это просто абстракция всего, что уже доступно стандартным API-интерфейсом Servlet, например HttpServletRequest, HttpSession, ServletContext и т.д. Просто используйте их прямо так же, как JSF делает "под капотами".

У вас есть 2 варианта:

  • Вместо этого используйте JSF PhaseListener. В зависимости от конкретного функционального требования, о котором вы ничего не говорили, это может быть довольно неуклюжие решения/обходные пути.

  • Не используйте JSF-предоставленную возможность Flash-области, но сами доморощенные. Принцип довольно прост: установите cookie при первоначальном запросе, отправьте перенаправление, в перенаправленном запросе найдите cookie и, чтобы удалить его (чтобы он больше не появлялся при последующем запросе). Именно так работает JSF Flash scope под капотами. См. Также Установить уведомление как атрибут запроса, который должен отображаться после sendRedirect для конкретного примера.