【问题标题】:could not find Factory: javax.faces.application.ApplicationFactory找不到工厂:javax.faces.application.ApplicationFactory
【发布时间】:2011-10-31 17:09:38
【问题描述】:

您好,我正在尝试同时使用以下技术:

  • JSF 2.1.0
  • ICEFaces 2.0.2 根据他们的文档,可以与 JSF 2.1.x 一起正常工作
  • Tomcat 6

我的web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
      version="2.5"> 

  <display-name>appName</display-name>

  <listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
  </listener>

  <listener>
    <listener-class>
        org.springframework.web.context.request.RequestContextListener
    </listener-class>
  </listener>

  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
        classpath:META-INF/spring/applicationContext.xml
        </param-value>

  </context-param>


  <context-param>
    <param-name>javax.faces.PROJECT_STAGE</param-name>
    <param-value>Development</param-value>
  </context-param>

  <welcome-file-list>
    <welcome-file>/</welcome-file>
  </welcome-file-list>



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

  <context-param>
    <param-name>javax.faces.FACELETS_SKIP_COMMENTS</param-name>
    <param-value>true</param-value>
  </context-param>


  <servlet>
    <servlet-name>Resource Servlet</servlet-name>
    <servlet-class>com.icesoft.faces.webapp.CompatResourceServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>Resource Servlet</servlet-name>
    <url-pattern>/xmlhttp/*</url-pattern>
  </servlet-mapping>

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

</web-app>

但是在尝试运行我的应用程序时,我遇到了以下异常:

SEVERE: Unexpected exception when attempting to tear down the Mojarra runtime
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.application.ApplicationFactory
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:815)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:317)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:112)
    at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:329)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4245)
    at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4886)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4750)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:840)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463)
    at org.apache.catalina.core.StandardService.start(StandardService.java:525)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:754)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:595)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)

任何想法为什么?

【问题讨论】:

    标签: jakarta-ee jsf-2 icefaces


    【解决方案1】:

    JSF 2.1 requires 一个 Servlet 3.0 兼容容器,而 Tomcat 6 只是一个 Servlet 2.5 compatible 容器。您有 2 个选择:

    1. 将 JSF 2.1 降级为 JSF 2.0(Mojarra 2.0 在 2.0.6 为 currently)。
    2. 将 Tomcat 6.0 升级到 Tomcat 7.0(并更改 web.xml 根声明符合 Servlet 3.0)。

    如果您选择选项 2(升级到 Tomcat 7.0),那么您应该将 Mojarra 2.1.0 升级到至少 Mojarra 2.1.1(currently 已经在 2.1.3)。这是必需的,因为 Mojarra 2.1.0 在注释扫描器中包含一个错误,使其与 Tomcat 和 Jetty 不兼容。

    另见:

    【讨论】:

    【解决方案2】:

    我用两种方法解决了这个问题:

    1.从项目中删除了两个不同版本的 jsf(例如 jsf 1.x 或 jsf2.x)或两个不同的 jsf 实现(mojarra jsf 或 myfaces)。我只使用了一个实现 mojarra(或 myfaces ) 但不是两者。我在 jsf 不同版本的 jars (即使用 jsf 2.x jars)而不是 jsf 1.x 的情况下做了同样的事情。

    2.从接口中移除@ManagedBean注解。

    【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2014-06-11
    • 2011-12-14
    • 2012-01-16
    相关资源
    最近更新 更多