java.lang.IllegalStateException: не удалось найти резервную копию для фабрики javax.faces.application.ApplicationFactory

Я использую это:

  • Tomcat 7.0
  • JSF 2.0
  • JRE 7

но при попытке запустить мое приложение я получил следующее исключение:

java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory. 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1011)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:343)
    at org.apache.myfaces.context.servlet.FacesContextImplBase.getApplication(FacesContextImplBase.java:159)
    at org.apache.myfaces.context.servlet.FacesContextImplBase.getELContext(FacesContextImplBase.java:210)
    at javax.faces.component.UIViewRoot.setLocale(UIViewRoot.java:1463)
    at org.apache.myfaces.webapp.AbstractFacesInitializer._createFacesContext(AbstractFacesInitializer.java:477)
    at org.apache.myfaces.webapp.AbstractFacesInitializer.initStartupFacesContext(AbstractFacesInitializer.java:449)
    at org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:113)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4797)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5291)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
    at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

Есть идеи почему?

Спасибо,

5 ответов

Решение

Это может произойти, если путь к классу во время выполнения вашего веб-приложения загрязнен несколькими версиями / версиями JSF. org.apache.myfaces Записи в трассировке стека говорят о том, что вы используете MyFaces. Таким образом, эта проблема говорит о том, что у вас есть другая реализация JSF, такая как Mojarra в пути к классам среды выполнения веб-приложения, которая конфликтует с ней. Это узнаваемо jsf-api.jar, или же jsf-impl.jar, или же javax.faces.jar, Если вы удалите все из них, то эта проблема должна исчезнуть.

Or, if you actually intented to use Mojarra instead of MyFaces (you did namely not explicitly state the intented JSF impl/version anywhere in your question, but you just generically stated the JSF spec as in "JSF 2.0", so perhaps you actually had no clue what you was all doing), then you should be removing myfaces-*.jar files from your webapp.

Смотрите также:

Дополняя ответ BalusC, я недавно получил эту ошибку при попытке запустить независимый JAR-файл с приложением Spring Boot, в котором JSF является внешним интерфейсом для bean-компонентов, управляемых Spring. Переключение упаковки с JAR на WAR решило проблему.

Для меня {Tomcat 8, JSF 2.2, JRE 8} сработали следующие шаги:

  1. Загрузите JSTL jars API && IMPL и поместите его в свою библиотеку Tomcat.

  2. Так как загрузка Majorra непосредственно из Eclipse в конфигурации аспектов проекта в последнее время невозможна; "Zip-файл - пустое исключение", загрузите вручную jsf-api.jar и jsf-impl.jar и включите их в новую пользовательскую библиотеку, добавленную в путь сборки (только один раз!).

Это мой web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>TestJSF</display-name>
  <welcome-file-list>
    <welcome-file>index.xhtml</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>/faces/*</url-pattern>
  </servlet-mapping>
  <context-param>
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
    <param-value>client</param-value>
  </context-param>
  <context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.application</param-value>
  </context-param>
  <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  </listener>
</web-app>

В моем случае это исключение было вызвано закрытием веб-приложения наличием com.sun.faces.config.ConfigureListenerв , под управлением Mojarra 2.2.x под Tomcat 8.0. Как описано в этом ответе , это заставляет Tomcat дважды регистрировать этого слушателя (как автоматически, так и в силу web.xmlзапись) и, следовательно, среди прочего, его contextDestroyedметод выполняется дважды, второй раз создает описанное исключение (скорее всего, потому что JSF уже был закрыт при первой регистрации слушателя).

В моем случае не было конфликта путей к классам: только одна версия Mojarra (2.2.6) и никаких MyFaces.

В дополнение к тому, что уже было сказано, я столкнулся с этой проблемой при импорте стороннего проекта, причина в том, что в pom.xml были определены два профиля: один для My Faces, а другой для Mojarra. Если это ваш случай, вам просто нужно выбрать один из них с помощью maven -P или в свойствах проекта, в разделе Maven, указав профили, которые будут использоваться.

Другие вопросы по тегам