java.lang.IllegalArgumentException: javax.faces.context.ExceptionHandlerFactory
проблема
В Eclipse IDE при развертывании веб-приложения JSF 2.0 в Tomcat 6.0.26 возникает следующее исключение и не удается запустить сервер 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) ...
Решение
В режиме отладки Eclipse загляните в исходный код и выясните, чтоIllegalArgumentException выбрасывается методомgetFactory() 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); //... }
Исключение IllegalArgumentException задокументировало, что средство поиска факторов не распознает новое имя фабрики JSF2.0ExceptionHandlerFactory.
После тысячи раз тестирования и попыток, наконец, я выяснил, что основная причина - вjavaee.jar, который включен в мой путь класса проекта. Загляните внутрьjavaee.jar, он также содержит набор JSF 1.2 api, похоже, Tomcat выбирает этот JSF 1.2 api вместо моего нового JSF 2.0 api.
После удаленияjavaee.jar из пути к классам проекта веб-приложение JSF 2.0 может запускаться и нормально работать на Tomcat.