web-dev-qa-db-fra.com

n'a pas pu trouver Factory: javax.faces.context.FacesContextFactory

Je remarque que lorsque j'essaie de configurer ma webapp JSF 2 en cours d'exécution sur la jetée, j'ai cette erreur:

Java.lang.IllegalStateException: l'application n'a pas été correctement initialisée au démarrage, n'a pas pu trouver Factory: javax.faces.context.FacesContextFactory

qui est facilement résolu en l'ajoutant à mon web.xml

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

J'ai essayé de chercher une explication détaillée mais en vain ..

jetty-maven-plugin: 8.0.3.v20111011: exécuter + jdk 7 + Eclipse Indigo

Et voici ma dépendance maven:

<dependencies>
    <dependency>
        <groupId>org.glassfish</groupId>
        <artifactId>javax.faces</artifactId>
        <version>2.1.3</version>
        <scope>compile</scope>
    </dependency>
</dependencies>

Voici mon web.xml:

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://Java.Sun.com/xml/ns/javaee" 
    xmlns:web="http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd"
    version="2.5">
    <display-name>Basic Setup Web Application</display-name>
    <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>
    <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
    <listener>
        <listener-class>
            com.Sun.faces.config.ConfigureListener
        </listener-class>
    </listener>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
</web-app>

et voici la sortie du plugin jetty:

[INFO] <<< jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup <<<
[INFO] 
[INFO] --- jetty-maven-plugin:8.0.3.v20111011:run (default-cli) @ BasicSetup ---
[INFO] Configuring Jetty for project: BasicSetup Maven Webapp
[INFO] webAppSourceDirectory C:\Users\albert\workspace\BasicSetup\src\main\webapp does not exist. Defaulting to C:\Users\albert\workspace\BasicSetup\src\main\webapp
[INFO] Reload Mechanic: automatic
[INFO] Classes = C:\Users\albert\workspace\BasicSetup\target\classes
[INFO] Context path = /basicSetup
[INFO] Tmp directory = C:\Users\albert\workspace\BasicSetup\target\tmp
[INFO] Web defaults = org/Eclipse/jetty/webapp/webdefault.xml
[INFO] Web overrides =  none
[INFO] web.xml file = file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/WEB-INF/web.xml
[INFO] Webapp directory = C:\Users\albert\workspace\BasicSetup\src\main\webapp
2011-10-25 14:24:51.091:INFO:oejs.Server:jetty-8.0.3.v20111011
2011-10-25 14:24:51.334:INFO:oejpw.PlusConfiguration:No Transaction manager found - if your webapp requires one, please configure one.
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/
2011-10-25 14:24:52.108:INFO:oejsh.ContextHandler:started o.m.j.p.JettyWebAppContext{/basicSetup,[file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/, jar:file:/C:/Users/albert/.m2/repository/org/glassfish/javax.faces/2.1.3/javax.faces-2.1.3.jar!/META-INF/resources/]},file:/C:/Users/albert/workspace/BasicSetup/src/main/webapp/
2011-10-25 14:24:52.149:WARN:/basicSetup:unavailable
Java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.Java:967)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.Java:316)
    at javax.faces.webapp.FacesServlet.init(FacesServlet.Java:302)
    at org.Eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.Java:456)
    at org.Eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.Java:276)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.servlet.ServletHandler.initialize(ServletHandler.Java:779)
    at org.Eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.Java:255)
    at org.Eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.Java:1212)
    at org.Eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.Java:610)
    at org.Eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.Java:453)
    at org.mortbay.jetty.plugin.JettyWebAppContext.doStart(JettyWebAppContext.Java:256)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.Java:224)
    at org.Eclipse.jetty.server.handler.ContextHandlerCollection.doStart(ContextHandlerCollection.Java:167)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerCollection.doStart(HandlerCollection.Java:224)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.Eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.Java:89)
    at org.Eclipse.jetty.server.Server.doStart(Server.Java:262)
    at org.mortbay.jetty.plugin.JettyServer.doStart(JettyServer.Java:65)
    at org.Eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.Java:59)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.startJetty(AbstractJettyMojo.Java:511)
    at org.mortbay.jetty.plugin.AbstractJettyMojo.execute(AbstractJettyMojo.Java:364)
    at org.mortbay.jetty.plugin.JettyRunMojo.execute(JettyRunMojo.Java:514)
    at org.Apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.Java:107)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:209)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:153)
    at org.Apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.Java:145)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:84)
    at org.Apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.Java:59)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.Java:183)
    at org.Apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.Java:161)
    at org.Apache.maven.DefaultMaven.doExecute(DefaultMaven.Java:319)
    at org.Apache.maven.DefaultMaven.execute(DefaultMaven.Java:156)
    at org.Apache.maven.cli.MavenCli.execute(MavenCli.Java:534)
    at org.Apache.maven.cli.MavenCli.doMain(MavenCli.Java:196)
    at org.Apache.maven.cli.MavenCli.main(MavenCli.Java:141)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at Java.lang.reflect.Method.invoke(Unknown Source)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.Java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.Java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.Java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.Java:352)
[INFO] Started Jetty Server
2011-10-25 14:24:52.165:INFO:oejs.AbstractConnector:Started [email protected]:8080 STARTING
[INFO] Starting scanner at interval of 10 seconds.

Des pensées ?

23
bertie

Cet écouteur est depuis JSF 1.x censé être automatiquement enregistré par le jsf_core.tld fichier de définition de bibliothèque de balises. Vous pouvez le trouver dans le /META-INF dossier du fichier JAR d'implémentation JSF. Dans le cas de Mojarra 2.1.3 (que vous semblez utiliser selon les journaux), l'écouteur est enregistré comme suit à partir de la ligne 80 et suivantes:

<!-- ============== Configuration Listener ============== -->

<!--
      This ServletContextListener initializes the runtime environment
      of the JavaServer Faces Reference Implementation when a web
      application including it is initialized by the container.
-->
<listener>
   <listener-class>com.Sun.faces.config.ConfigureListener</listener-class>
</listener>      

Cependant, cela n'a apparemment pas été correctement récupéré par Jetty. J'ai également lu quelque part que lorsque le FacesServlet est initialisé avant le fichier TLD est traité, vous obtiendrez également exactement cette exception. Peut-être que cela se produit à Jetty. Pour exclure l'un et l'autre, essayez de supprimer le <load-on-startup> entrée afin qu'il ne soit chargé que sur la première requête HTTP concrète, bien après le traitement du TLD. De toute façon, enregistrer explicitement l'auditeur dans web.xml devrait en effet le résoudre.

De plus, depuis JSF 2.x, en plus du fichier TLD, l'auditeur est également censé être automatiquement enregistré par une implémentation ServletContainerInitializer dans le fichier JAR afin de contourner un Glassfish 3 bug. Dans Mojarra 2.x, c'est le com.Sun.faces.config.FacesInitializer classe qui a les lignes suivantes à partir de la ligne 131:

// The following line is temporary until we can solve an ordering
// issue in V3.  Right now the JSP container looks for a mapping
// of the FacesServlet in the web.xml.  If it's not present, then
// it assumes that the application isn't a faces application.  In this
// case the JSP container will not register the ConfigureListener
// definition from our TLD nor will it parse cause or JSP TLDs to
// be parsed.
servletContext.addListener(com.Sun.faces.config.ConfigureListener.class);

Cela fonctionne uniquement dans les conteneurs Servlet 3.0, tels que Tomcat 7, Glassfish 3, Jetty 8 (soi-disant!), Etc. Vous semblez utiliser Jetty 8.0 qui devrait donc être conforme à Servlet 3.0, mais votre web.xml est déclaré Servlet 2.5 conforme, le conteneur s'exécutera donc en mode de repli Servlet 2.5. Changer votre web.xml pour se conformer Servlet 3.0 devrait déclencher cet initialiseur.

30
BalusC

Une autre solution: j'ai eu cette erreur après avoir créé des fichiers Java à la volée avec CXF à partir de wsdl.

JaxWsDynamicClientFactory factory = JaxWsDynamicClientFactory.newInstance();
Client client = factory.createClient(wsdlURL, serviceName);

CXF place son propre ClassLoader (instance de URLClassLoader) dans le chargeur de classe du Thread. Cela fonctionne normalement, jusqu'à ce que le thread de l'utilisateur pénètre dans FactoryFinder de JSF, qui est mis en cache par ClassLoader comme clé. Étant donné que le ClassLoader a changé, il crée un nouveau FactoryManager, qui ne peut pas être initialisé, car les listes d'instances d'implémentation sont supprimées lorsque le FactoryManager d'origine est lancé. À cause de cela, les classes d'implémentation ne sont pas trouvées, d'où l'exception IllegalStateException est levée.

Solution: sauvegardez le ClassLoader d'origine avant createClient de CXF, enregistrez l'URLClassLoader dans une variable et remettez le ClassLoader d'origine dans le thread. Lorsque vous souhaitez accéder à une classe dynamique à partir de CXF, recherchez-la dans l'URLClassLoader que vous avez inséré dans une variable.

0
Pittmann György