【问题标题】:java.lang.IllegalStateException:Could not find backup for factory javax.faces.application.ApplicationFactoryjava.lang.IllegalStateException:找不到工厂 javax.faces.application.ApplicationFactory 的备份
【发布时间】:2013-09-24 17:28:18
【问题描述】:

我正在使用这个:

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

任何想法为什么?

谢谢,

【问题讨论】:

  • 我在重启 Eclipse 后遇到了同样的问题。从服务器中删除项目并重新运行它会使问题消失。

标签: jsf jsf-2 factory illegalstateexception


【解决方案1】:

如果您的 web 应用程序的运行时类路径被多个 JSF 实现/版本污染,则可能会发生这种情况。堆栈跟踪中的 org.apache.myfaces 条目表明您正在使用 MyFaces。因此,此问题表明您在 webapp 的运行时类路径中有另一个 JSF 实现,例如 Mojarra,它与它发生冲突。可通过jsf-api.jarjsf-impl.jarjavax.faces.jar 识别。如果您将它们全部删除,那么这个问题应该会消失。

或者,如果您实际上打算使用 Mojarra 而不是 MyFaces(您没有在问题的任何地方明确说明意图的 JSF impl/version,但您只是在“JSF 2.0”中一般性地说明了 JSF 规范,所以也许您实际上不知道自己在做什么),那么您应该从您的 web 应用程序中删除 myfaces-*.jar 文件。

另见:

【讨论】:

    【解决方案2】:

    补充 BalusC 的答案,我最近在尝试使用 Spring Boot 应用程序运行独立 JAR 时遇到此错误,该应用程序将 JSF 作为前端并使用 Spring 管理的 bean。将包装从 JAR 切换到 WAR 解决了这个问题。

    【讨论】:

      【解决方案3】:

      对我来说 {Tomcat 8, JSF 2.2, JRE 8},以下步骤有效:

      1. 下载 JSTL jars API && IMPL 并将其放入您的 Tomcat 库中。

      2. 自从在项目中直接从 eclipse 下载 Majorra 方面配置最近是不可能的; "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>
      

      【讨论】:

        【解决方案4】:

        除了已经说过的,我在导入第三方项目时遇到了这个问题,原因是在 pom.xml 中定义了两个配置文件,一个用于 My Faces,另一个用于 Mojarra。 如果是这种情况,您只需使用 maven -P 或在项目属性的 Maven 部分中选择其中之一,指示要使用的配置文件。

        【讨论】:

          【解决方案5】:

          在我的情况下,此异常是由于在 web.xml 中存在 com.sun.faces.config.ConfigureListener 在 Tomcat 8.0 下运行 Mojarra 2.2.x 导致的 webapp 关闭。如this answer 中所述,这会导致 Tomcat 注册该侦听器两次(自动注册和通过 web.xml 条目),因此除其他外,它的 contextDestroyed 方法被执行两次,第二次生成所描述的异常(很可能是因为 JSF 已被第一个监听器注册关闭)。

          在我的案例中没有类路径冲突:只有一个版本的 Mojarra (2.2.6),没有 MyFaces。

          【讨论】:

            猜你喜欢
            • 2014-06-11
            • 1970-01-01
            • 1970-01-01
            • 2014-09-07
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多