À quoi sert faces-config.xml dans JSF 2?

89

Après le gros support JSF 2 pour les annotations, je me demande à quoi j'utiliserais le faces-config.xml. Quelle est son importance maintenant?

En d'autres termes, quelles sont les configurations qui ne peuvent être effectuées que via faces-config.xmlet non via des annotations?

Pour le moment, tout ce que je l'utilise est de déclarer le résolveur 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
la source
1
Pourquoi avons-nous besoin de spécifier le ELResolver intégré? Je pensais que la philosophie de conception était la convention sur la configuration ...
masterxilo
Je n'ai pas non plus <el-resolver>dans mon faces-config.xmlet cela fonctionne parfaitement.
Roland

Réponses:

142

Il doit encore être utilisé pour de nombreuses choses qui ne peuvent pas être annotées. Par exemple, messages de validation JSF personnalisés:

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

Un bundle i18n global (pour que vous n'ayez pas besoin de déclarer <f:loadBundle>dans chaque vue):

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

Les locales i18n explicitement prises en charge (afin que celles non déclarées soient ignorées même s'il existe un ensemble de messages ou de ressources pour cela):

<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>

Gestionnaires de vues personnalisées :

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

Écouteurs de phase (il n'y a toujours pas d'annotation pour cela):

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

Haricots gérés qui ne peuvent être annotés (ci - dessous l'on donne en cours Datesur #{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>

Usines personnalisées, telles que l' usine de traitement d'exception personnalisée (elle permet aussi des usines pour FacesContext, ExternalContext, LifeCycleet beaucoup d' autres pour que vous puissiez fournir votre implémentation personnalisée):

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

Pour ne citer que ceux couramment utilisés. Si vous avez la faces-config.xmlsaisie semi-automatique des balises dans votre IDE, vous pouvez toutes les trouver. Seuls les beans gérés, les validateurs, les convertisseurs, les composants, les moteurs de rendu et les cas de navigation point à point ne sont plus nécessaires grâce aux nouvelles annotations et à la navigation implicite.

BalusC
la source
7
@Matt: J'ai eu un projet où un java.util.HashMapas #{components}est stocké dans la portée de la requête pour avoir une meilleure vue d'ensemble déclarative de toutes les liaisons de composants. Par exemple, binding="#{components.foo}"pour qu'il puisse être référencé comme #{components.foo}étant plus auto-documenté et moins risqué (en raison de conflits de noms potentiels) que binding="#{foo}"et #{foo}.
BalusC
2
Je cherchais également une annotation pour spécifier el-resolver. Maintenant, je pense qu'il n'y a aucun moyen de spécifier ces propriétés d'application via une annotation .. à droite .. ??
Rup Majumder
@RupMajumder Où voulez-vous mettre une telle annotation, je veux dire sur quelle classe? Cette propriété est répartie sur l'ensemble de l'application.
iozee
1
FWIW, lors de l'utilisation d'Apache Deltaspike, l'annotation JsfPhaseListener peut être utilisée pour utiliser des écouteurs de phase sans avoir besoin de les configurer dans faces-config.xml.
jpangamarca