java.lang.IllegalStateException:无法找到工厂的备份



我创建了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

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

IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory

如果替换"backup"通过"implementation"它最终归结为"我找到了JSF API,但是在与我找到JSF API的相同的类路径上下文中没有JSF隐含"。换句话说,在运行时类路径中有一个JSF API,但它没有任何JSF隐含函数。例如,在相同的类路径上下文中有jsf-api.jar甚至javaee.jar而没有任何jsf-impl.jarjavax.faces.jar。注意,一个web应用程序可以有多个类路径上下文。根据类加载规则,JSF impl必须出现在与第一次遇到的JSF API完全相同的位置,并且您需要绝对确保没有重复和/或冲突的版本。

在你的特殊情况下,

我已经将这些jar文件添加到我的项目中:jstl-1.2.jarjavax.faces-api-2.2.jar

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

  • 这就是"蓝图"API JAR,用于JSF实现者,如Mojarra和MyFaces。
  • 您忘记了JSF实现JAR。

如果您想使用Mojarra,请遵循其README中的安装说明。在您的具体情况下,去掉javax.faces-api-2.2.jar并将最新的javax.faces-2.x.x.jar放在/WEB-INF/libpom.xml中,此异常应该消失。

参见:

  • 如何通过Maven正确安装和配置JSF库?

需要将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

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

最新更新