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

Posted

技术标签:

【中文标题】java.lang.IllegalStateException:找不到工厂 javax.faces.context.FacesContextFactory 的备份【英文标题】:java.lang.IllegalStateException : Could not find backup for factory javax.faces.context.FacesContextFactory 【发布时间】:2014-10-11 18:08:33 【问题描述】:

我创建了我的 hello world JSF 项目,但是当我部署到 Tomcat 7 时,我得到了这个异常:

java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory. 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1135)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:350)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
    at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:864)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:134)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

我已将这些 JAR 添加到我的项目中:

jstl-1.2.jar javax.faces-api-2.2.jar

这是怎么引起的,我该如何解决?

【问题讨论】:

***.com/questions/18897900/… 的重复项? 感谢您的回答。我已经看到了,但这并没有解决我的问题 【参考方案1】:

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

如果您将“备份”替换为“实施”,则此异常更容易理解。它最终归结为“我找到了 JSF API,但没有一个 JSF impl 在与我找到 JSF API 的地方相同的类路径上下文中”。换句话说,您在运行时类路径中的某处有一个 JSF API,它没有附带任何 JSF 实现。例如。在同一个类路径上下文中没有任何jsf-impl.jarjavax.faces.jarjsf-api.jar 甚至javaee.jar。请注意,一个 Web 应用程序可以有多个类路径上下文。根据类加载规则,JSF impl 必须与第一次遇到的 JSF API 位于完全相同的位置,并且您需要绝对确保没有重复和/或冲突的版本。

在您的具体情况下,

我已将此 jars 添加到我的项目中:jstl-1.2.jarjavax.faces-api-2.2.jar

单独javax.faces-api-2.2.jar 是不对的。有两个问题:

这是“蓝图”API JAR,专为 Mojarra 和 MyFaces 等 JSF 实现者设计。 您忘记了 JSF 实现 JAR。

如果您想使用 Mojarra,请按照其README 中的安装说明进行操作。在您的具体情况下,摆脱 javax.faces-api-2.2.jar 并将最新的 javax.faces-2.x.x.jar 放在 /WEB-INF/libpom.xml 中,此异常应该会消失。

另见:

How to properly install and configure JSF libraries via Maven?

【讨论】:

【参考方案2】:

感谢我的同事,@Lookub at ***,他添加了另一个 apache 服务器并将端口设置为 8084,全部编译。作为 ide,我们使用的是 netbeans 8.2。您可以在 Services>>Servers 菜单中执行此操作。希望这可以帮助。

【讨论】:

【参考方案3】:

需要把ear项目的weblogic-application.xml改成

<?xml version='1.0' encoding='UTF-8'?>
<weblogic-application xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-application" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-application 
    http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd">

    <prefer-application-packages>
        <package-name>org.opensaml.*</package-name>
        <package-name>org.slf4j.*</package-name>
        <package-name>antlr.*</package-name>        
    </prefer-application-packages>
    <prefer-application-resources>
        <resource-name>javax.faces.*</resource-name>
        <resource-name>com.sun.faces.*</resource-name>
        <resource-name>com.bea.faces.*</resource-name>
        <resource-name>META-INF/services/javax.servlet.ServletContainerInitializer</resource-name>
        <resource-name>META-INF/services/com.sun.faces.spi.FacesConfigResourceProvider</resource-name>
    </prefer-application-resources>
</weblogic-application>

以下 jar 版本号必须完全匹配:

javax.faces-2.x.x.jar jsf-api-2.x.x.jar jsf-impl-2.x.x.jar

【讨论】:

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