我正在使用它:
但是在尝试运行我的应用程序时,我遇到了以下异常:
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)
任何想法为什么?
谢谢,
答案 0 :(得分:30)
如果您的webapp的运行时类路径被多个JSF impls /版本污染,可能会发生这种情况。堆栈跟踪中的org.apache.myfaces
条目告诉您正在使用MyFaces。因此,这个问题表明你在webapp的运行时类路径中有另一个像Mojarra这样的JSF实现,它与之相冲突。它可以通过jsf-api.jar
,jsf-impl.jar
或javax.faces.jar
识别。如果删除所有这些,则此问题应该消失。
或者,如果你真的打算使用Mojarra而不是MyFaces(你确实没有在你的问题的任何地方明确说明有意的JSF impl /版本,但你只是在JSF 2.0中一般性地陈述了JSF规范,所以也许你实际上不知道你在做什么),那么你应该从你的webapp中删除myfaces-*.jar
个文件。
答案 1 :(得分:4)
补充BalusC的答案,我最近在尝试使用Spring Boot应用程序运行独立JAR时出现此错误,该应用程序将JSF作为Spring管理bean的前端。将包装从JAR切换到WAR解决了这个问题。
答案 2 :(得分:1)
对我来说{Tomcat 8,JSF 2.2,JRE 8},以下步骤有效:
下载JSTL jars API && IMPL并将其放置在您的Tomcat库中。
因为直接从Eclipse中的项目中下载了Majorra 构面配置最近不可能; “压缩文件为空异常”, 手动下载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>
答案 3 :(得分:0)
除此之外,我在导入第三方项目时遇到了这个问题,原因是在 pom.xml 中定义了两个配置文件,一个用于 My Faces,另一个用于 Mojarra。 如果是这种情况,您只需使用 maven -P 或在项目属性的 Maven 部分中选择其中一个,指明要使用的配置文件。