Приложение JSF 2.0 под Tomcat 6: Фабрики не настроены.

Я пытаюсь запустить веб-приложение JSF 2.0, используя Apache MyFaces 2.1.7 на веб-сервере Tomcat 6. Приложение использует Tomahawk 1.1.11 и язык выражений 2.2 (el-impl-2.2.jar). Для этого я поместил myfaces-api и myfaces-impl в папку Tomcats lib и заменил Tomcats el-api.jar на вариант 2.2.

Когда я вызываю первую страницу приложения, я всегда получаю сообщение об ошибке:

java.lang.IllegalStateException: No Factories configured for this Application. This 
happens if the faces-initialization does not work at all - make sure that you properly 
include all configuration settings necessary for a basic faces application and that all 
the necessary libs are included. Also check the logging output of your web application 
and your container for any exceptions!
If you did that and find nothing, the mistake might be due to the fact that you use 
some special web-containers which do not support registering context-listeners via TLD 
files and a context listener is not setup in your web.xml.
A typical config looks like this;
<listener>
 <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

javax.faces.FactoryFinder._getFactory(FactoryFinder.java:286)
javax.faces.FactoryFinder.getFactory(FactoryFinder.java:206)
javax.faces.webapp.FacesServlet.init(FacesServlet.java:116)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
java.lang.Thread.run(Thread.java:679)

У меня определенно есть фрагмент xml, упомянутый в моем файле web.xml. Я попытался выполнить отладку кода и обнаружил, что registeredFactoryNames в строке 267 из javax.faces.FactoryFinder пусто, что вызывает ошибку. Однако я не понимаю, почему это так. Что там должно быть и как туда попасть?

Самое смешное, что веб-приложение отлично работает с использованием встроенного причала 8. Так что это должна быть какая-то проблема с зависимостями.

Надеюсь, что кто-то с большим пониманием всего этого может помочь мне здесь.


person ali    schedule 24.07.2012    source источник


Ответы (2)


Ok

Я нашел проблему. Ошибка возникает из-за того, что myfaces-api.jar дважды указан в вашем пути к классам. Итак, для меня проблема заключалась в том, что я поместил myfaces-api.jar в папку tomcat lib и в папку WEB-INF/lib веб-приложения.

При использовании встроенного tomcat с maven у меня был myfaces-api.jar в зависимостях всего приложения и в зависимостях плагина tomcat6-maven с областью компиляции обоих. Я изменил область действия с компиляции на предоставленную в разделе глобальных зависимостей, и это сработало.

person ali    schedule 25.07.2012

Я думаю, что это можно решить, просто добавив пустой файл Faces-config.xml в папку /WEB-INF/, чтобы указать, что приложение использует JSF, а MyFaces продолжает этап инициализации. См. подробности в классе org.apache.myfaces.ee6.MyFacesContainerInitializer.

person lu4242    schedule 24.07.2012
comment
На самом деле у меня есть пустой Faces-config.xml в WEB-INF. Приложение не работало бы под причалом, если бы это было не так. - person ali; 25.07.2012
comment
Я не думаю, что это поможет, так как это вызывает старый плагин tomcat. Новый вызывается с помощью tomcat6:run или tomcat7:run. Это работает как шарм. Я думаю, что проблема на самом деле не связана с плагином maven, но имеет какое-то отношение к удовлетворению зависимостей. Я отредактировал вопрос с моим новейшим исследованием. - person ali; 25.07.2012
comment
Я также пробовал с tomcat6:run-war. Это все та же проблема. - person ali; 25.07.2012