java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory
Problème
Dans Eclipse IDE, lors du déploiement d'une application Web JSF 2.0 sur Tomcat 6.0.26, frappe l'exception suivante et n'a pas pu démarrer le serveur Tomcat.
P.S Both jsf-api-2.1.0-b03.jar and jsf-impl-2.1.0-b03.jar libraries are included in the project classpath.
INFO: Unsanitized stacktrace from failed start... java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630) at javax.faces.FactoryFinder.setFactory(FactoryFinder.java:287) ... SEVERE: Critical error during deployment: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! javax.faces.context.ExceptionHandlerFactory ... Caused by: java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory at javax.faces.FactoryFinder.validateFactoryName(FactoryFinder.java:630) ...
Solution
En mode de débogage Eclipse, fouillez dans le code source, découvrez que leIllegalArgumentException est renvoyé par la méthodegetFactory() de FactoryFinder.
FactoryFinder.java
/* * @throws IllegalArgumentException iffactoryName
does not * identify a standard JavaServer Faces factory name * @throws IllegalStateException if there is no configured factory * implementation class for the specified factory name * @throws NullPointerException iffactoryname
* is null */ public static Object getFactory(String factoryName) throws FacesException { validateFactoryName(factoryName); //... }
L'exception IllegalArgumentException a documenté que le chercheur de facteurs ne reconnaît pas le nouveau nom d'usine JSF2.0ExceptionHandlerFactory.
Après des milliers de tests et d'essais, enfin, je découvre que la cause principale provient desjavaee.jar, qui sont inclus dans le chemin de classe de mon projet. Regardez à l'intérieur dujavaee.jar, il contient également un ensemble d'API JSF 1.2, on dirait que Tomcat choisit cette API JSF 1.2 au lieu de ma nouvelle API JSF 2.0.
Après avoir supprimé lesjavaee.jar du chemin de classe du projet, l'application Web JSF 2.0 est capable de démarrer et de fonctionner correctement sur Tomcat.