¿Cuál es el uso de faces-config.xml en JSF 2?

89

Después del gran soporte de JSF 2 para anotaciones, me pregunto para qué usaría faces-config.xml. ¿Cuál es su importancia ahora?

En otras palabras, ¿cuáles son las configuraciones que solo se pueden realizar mediante faces-config.xmly no mediante anotaciones?

En este momento, todo lo que estoy usando es para declarar el resolutor EL de Spring.

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

    <application>
        <el-resolver>
            org.springframework.web.jsf.el.SpringBeanFacesELResolver
        </el-resolver>
    </application> 
</faces-config>
Mahmoud Saleh
fuente
1
¿Por qué necesitamos especificar el ELResolver incorporado? Pensé que la filosofía de diseño es la convención sobre la configuración ...
masterxilo
Tampoco tengo <el-resolver>en mi faces-config.xmly está funcionando perfectamente.
Roland

Respuestas:

142

Todavía se usa para muchas cosas que no se pueden anotar. Por ejemplo, mensajes de validación JSF personalizados:

<application>
    <message-bundle>com.example.i18n.messages</message-bundle>
</application>

Un paquete i18n global (para que no necesite declarar <f:loadBundle>en cada vista):

<application>
    <resource-bundle>
        <base-name>com.example.i18n.Text</base-name>
        <var>text</var>
    </resource-bundle>
</application>

Locales i18n explícitamente admitidos (de modo que los no declarados se ignorarán aunque haya un paquete de mensajes o un paquete de recursos para ellos):

<application>
    <locale-config>
        <default-locale>en</default-locale>
        <supported-locale>nl</supported-locale>
        <supported-locale>es</supported-locale>         
        <supported-locale>de</supported-locale>         
    </locale-config>
</application>

Controladores de vista personalizada :

<application>
    <view-handler>com.example.SomeViewHandler</view-handler>
</application>

Escuchas de fase (todavía no hay una anotación para eso):

<lifecycle>
    <phase-listener>com.example.SomePhaseListener</phase-listener>
</lifecycle>

Frijoles administrados que no se pueden anotar (el de abajo da información actual Date de #{now}):

<managed-bean>
    <description>Current date and time</description>
    <managed-bean-name>now</managed-bean-name>
    <managed-bean-class>java.util.Date</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Fábricas personalizados, tales como fábrica de manejadores de excepción personalizada (también permite que las fábricas de FacesContext, ExternalContext,LifeCycle y muchos más para que pueda proporcionar su implementación personalizada):

<factory>
    <exception-handler-factory>com.example.SomeExceptionHandlerFactory</exception-handler-factory>
</factory>

Para nombrar solo los de uso común. Si tiene el faces-config.xmlautocompletado de etiquetas en su IDE, puede encontrarlos todos. Solo los beans administrados, validadores, convertidores, componentes, renderizadores y casos de navegación punto a punto ya no son necesarios gracias a las nuevas anotaciones y la navegación implícita.

BalusC
fuente
7
@Matt: Tuve un proyecto en el que un java.util.HashMapas #{components}se almacena en el alcance de la solicitud para tener una mejor descripción general declarativa de todos los enlaces de componentes. Por ejemplo, binding="#{components.foo}"para que se pueda hacer referencia a él como #{components.foo}que es más autodocumentado y menos riesgoso (debido a posibles conflictos de nombres) que binding="#{foo}"y #{foo}.
BalusC
2
También estaba buscando alguna anotación para especificar el-resolver. Ahora creo que no hay forma de especificar estas propiedades de la aplicación a través de la anotación ... ¿verdad ... ??
Rup Majumder
@RupMajumder ¿Dónde quieres poner esa anotación, me refiero a en qué clase? Esta propiedad se extiende a toda la aplicación.
iozee
1
FWIW, cuando se usa Apache Deltaspike, la anotación JsfPhaseListener se puede usar para usar detectores de fase sin la necesidad de configurarlos en faces-config.xml.
jpangamarca