web-dev-qa-db-fra.com

java.lang.IllegalStateException: impossible de trouver la sauvegarde pour la fabrique javax.faces.application.ApplicationFactory

J'utilise ceci: 

  • Tomcat 7.0
  • JSF 2.0
  • JRE 7

mais en essayant d'exécuter mon application, j'ai eu l'exception suivante:

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)

Des idées pourquoi? 

Merci,

25
Benjamin Gimet

Cela peut arriver si le chemin d'accès aux classes de votre application Web est pollué par plusieurs implémentations/versions de JSF. Les entrées org.Apache.myfaces dans la trace de la pile indiquent que vous utilisez MyFaces. Ce problème suggère donc que vous avez une autre implémentation JSF telle que Mojarra dans le classpath d'exécution de l'application Web qui est en conflit avec celui-ci. Il est reconnaissable par jsf-api.jar ou jsf-impl.jar ou javax.faces.jar. Si vous les supprimez tous, le problème devrait disparaître.

Ou, si vous aviez réellement l'intention d'utiliser Mojarra au lieu de MyFaces (vous n'avez en effet pas explicitement déclaré l'implication/la version JSF voulue dans la question, mais vous avez simplement indiqué de manière générique que la spécification JSF était dans "JSF 2.0"; pas la moindre idée de ce que vous faisiez tous), vous devriez alors supprimer les fichiers myfaces-*.jar de votre application Web.

Voir également:

30
BalusC

Pour compléter la réponse de BalusC, j'ai récemment eu cette erreur en essayant d'exécuter un fichier JAR indépendant avec une application Spring Boot avec JSF comme interface frontale avec des beans gérés par Spring. Basculer l’emballage de JAR à WAR a résolu le problème.

4
Cenobyte321

Pour moi {Tomcat 8, JSF 2.2, JRE 8}, les étapes suivantes ont fonctionné:

  1. Téléchargez l'API des jars JSTL && IMPL et placez-le dans votre bibliothèque Tomcat.

  2. Depuis le téléchargement de Majorra directement depuis Eclipse dans le projet, la configuration des facettes est récemment impossible. "Le fichier zip est une exception vide", Téléchargez manuellement jsf-api.jar et jsf-impl.jar et incluez-les dans une bibliothèque utilisateurnew ajoutée au chemin de construction (une seule fois!).

C'est mon 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>
0
TiyebM