错误找不到工厂:javax.faces.context.FacesContextFactory

Posted

技术标签:

【中文标题】错误找不到工厂:javax.faces.context.FacesContextFactory【英文标题】:Error Could not find Factory: javax.faces.context.FacesContextFactory 【发布时间】:2012-03-05 14:49:07 【问题描述】:

我正在尝试使用 Eclipse 运行示例 primefaces 3.1 应用程序。当我运行时,我得到以下异常。我已将 jstl-1.0.2.jar,jsf-impl-2.0.3.jar,jsf-api-2.0.3.jar,primefaces-3.1.jar 放在 WEb-INF/lib 文件夹下,index.jsf 放在/Web 内容。

Problem accessing /TestPrime/index.jsf. Reason: 

    java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory

Caused by:
javax.servlet.UnavailableException: java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
    at org.mortbay.jetty.servlet.ServletHolder.makeUnavailable(ServletHolder.java:415)
    at org.mortbay.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:458)
    at org.mortbay.jetty.servlet.ServletHolder.doStart(ServletHolder.java:263)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.servlet.ServletHandler.initialize(ServletHandler.java:685)
    at org.mortbay.jetty.servlet.Context.startContext(Context.java:140)
    at org.mortbay.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1250)
    at org.mortbay.jetty.handler.ContextHandler.doStart(ContextHandler.java:517)
    at org.mortbay.jetty.webapp.WebAppContext.doStart(WebAppContext.java:467)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerCollection.doStart(HandlerCollection.java:152)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.mortbay.jetty.handler.HandlerWrapper.doStart(HandlerWrapper.java:130)
    at org.mortbay.jetty.Server.doStart(Server.java:224)
    at org.mortbay.component.AbstractLifeCycle.start(AbstractLifeCycle.java:50)
    at org.eclipse.wst.server.preview.internal.PreviewStarter.run(PreviewStarter.java:72)
    at org.eclipse.wst.server.preview.internal.PreviewStarter.main(PreviewStarter.java:29)

我的web.xml如下:

<web-app version="2.5">
    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" >

    <welcome-file-list>
        <welcome-file>index.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>*.jsf</url-pattern>
    </servlet-mapping>

</web-app>

更新 1

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
     <listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>
    <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>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
    <mime-mapping>
        <extension>png</extension>
        <mime-type>image/png</mime-type>
    </mime-mapping>
    <welcome-file-list>
        <welcome-file>login.jsf</welcome-file>
    </welcome-file-list>    
</web-app>

【问题讨论】:

【参考方案1】:

这是 Jetty 的错。它以某种方式没有执行在 JSF TLD 文件中注册的 JSF ConfigureListener

将以下条目添加到您的 web 应用的 web.xml 以手动注册它:

<listener>
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
</listener>

另见:

could not find Factory: javax.faces.context.FacesContextFactory

【讨论】:

感谢您的帮助。我在 web.xml 中添加了&lt;listener&gt; &lt;listener-class&gt;com.sun.faces.config.ConfigureListener&lt;/listener-class&gt; &lt;/listener&gt;,当我运行时出现错误HTTP ERROR: 404 Problem accessing /TestPrime/faces/login.jsf. Reason: NOT_FOUND -------------------------------------------------------------------------------- Powered by Jetty:// 这是一个不同的问题。该资源不在您期望的位置。 URL 错误或资源尚未部署。你最初的问题已经解决了。如果您卡住了,请提出一个新问题。 非常感谢。巴鲁斯 C.我需要弄清楚为什么我会收到 HTTP ERROR: 404 Problem accessing /TestPrime/faces/login.jsf. Reason: NOT_FOUND 错误。

以上是关于错误找不到工厂:javax.faces.context.FacesContextFactory的主要内容,如果未能解决你的问题,请参考以下文章

Spring JPA - 找不到实体管理器工厂,为啥?

找不到工厂:javax.faces.context.FacesContextFactory

PHPUnit测试找不到工厂

异常找不到工厂:javax.faces.application.ApplicationFactory

检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 800*****。

java.lang.IllegalStateException:找不到工厂 javax.faces.context.FacesContextFactory 的备份