In komplexen JSF-Konfigurationen kann es passieren, dass man den Faces Context vor dem eigentlichen Aufruf des Faces Servlets braucht. Zum Beispiel um Faces Messages in Spring Security oder anderen Servlet Filtern zu erzeugen.

In diesem Fall kann der Faces Filter vor den betroffenen Filtern gesetzt werden. Die anderen Filter zwischen dem Faces Filter und dem Faces Servlet können dann auf den Faces Context zugreifen:

Faces Filter ist Bestandteil von JSF Ext und durch das Intersult Maven Repository zu beziehen.

Beispiel#

Folgende Beispielkonfiguration zeigt das Zusammenspiel unterschiedlicher Einträge in der web.xml:
	<filter>
		<filter-name>RequestContextFilter</filter-name>
		<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
	        <async-supported>true</async-supported>
	</filter>
	<filter-mapping>
		<filter-name>RequestContextFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>

	<filter>
	    <filter-name>OpenEntityManagerInViewFilter</filter-name>
	    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
	        <async-supported>true</async-supported>
	</filter>
	<filter-mapping>
	    <filter-name>OpenEntityManagerInViewFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<filter>
		<filter-name>Pretty Filter</filter-name>
		<filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class>
        <async-supported>true</async-supported>
	</filter>
	<filter-mapping>
		<filter-name>Pretty Filter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>ERROR</dispatcher>
	</filter-mapping>
	
	<filter>
		<filter-name>Faces Filter</filter-name>
		<filter-class>com.intersult.jsf.FacesFilter</filter-class>
	        <async-supported>true</async-supported>
	</filter>
	<filter-mapping>
		<filter-name>Faces Filter</filter-name>
		<url-pattern>/faces/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
	
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	        <async-supported>true</async-supported>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>FORWARD</dispatcher>
		<dispatcher>REQUEST</dispatcher>
	</filter-mapping>
	
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	        <async-supported>true</async-supported>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>

Erklärung: Der Faces Filter ist hier auf die Request-Typen REQUEST und FORWARD gemappt, weil der Pretty Faces Filter sonst das Ausführen verhindern würde. Filter wie OpenEntityManagerInViewFilter können vorher ausgeführt werden, da sie keinen Faces Context brauchen. Wichtig ist das Ausführen der Filter mit JSF-Code zwischen Faces Filter und Faces Servlet, hier ist dies "springSecurityFilterChain".

Warnung: Das Mappen von Filtern auf Servlet-Definitionen, also zum Beispiel "FacesServlet", kann zum verspäteten Ausführen dieses Filters führen. In diesem Fall ist ein URL-Mapping auf /faces/* zu verwenden.