web-dev-qa-db-ja.com

Factoryが見つかりませんでした:javax.faces.context.FacesContextFactory

Jettyで実行されているJSF 2 webappをセットアップしようとすると、このエラーが発生します。

Java.lang.IllegalStateException:アプリケーションは起動時に適切に初期化されなかったため、ファクトリを見つけることができませんでした:javax.faces.context.FacesContextFactory

これをweb.xmlに追加することで簡単に解決できます

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

詳細な説明を探してみましたが、無駄です。

jetty-maven-plugin:8.0.3.v20111011:run + jdk 7 + Eclipse Indigo

そして、これが私のMaven依存関係です:

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

これが私の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>

そして、これが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.

何かご意見は ?

23
bertie

このリスナーは、JSF 1.xが_jsf_core.tld_タグライブラリ定義ファイルによって自動的に登録されることになっているためです。 JSF実装JARファイルの_/META-INF_フォルダーにあります。 Mojarra 2.1.3(ログに従って使用しているようです)の場合、リスナーは80行目から次のように登録されます。

_<!-- ============== 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>      
_

ただし、これはJettyによって適切に選択されていないようです。 FacesServletが初期化されると、TLDファイルが処理される前にどこかを読んだことがあります。この例外。おそらく、これはJettyで起こっています。これらを除外するには、TLDが処理された後、最初の具体的なHTTP要求でのみ読み込まれるように_<load-on-startup>_エントリを削除してください。いずれにしても、リスナーを_web.xml_に明示的に登録すると、実際に解決するはずです。

さらに、JSF 2.x以降、TLDファイルに加えて、Glassfishを回避するために、リスナーはJARファイルの ServletContainerInitializer 実装によって自動的に登録されることも想定されています3バグ。 Mojarra 2.xでは、これは_com.Sun.faces.config.FacesInitializer_クラスであり、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);
_

これは、Tomcat 7、Glassfish 3、Jetty 8(おそらく!)などのServlet 3.0コンテナでのみ機能します。したがって、Servlet 3.0に準拠するJetty 8.0を使用しているようですが、_web.xml_はServletに準拠していると宣言されています2.5。したがって、コンテナはServlet 2.5フォールバックモードで実行されます。 _web.xml_を変更してサーブレット3.0に準拠させると、この初期化子がトリガーされます。

30
BalusC

もう1つの解決策:Java wsdlのCXFを使用してオンザフライでファイルを作成した後、このエラーが発生しました。

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

CXFは、独自のClassLoader(URLClassLoaderのインスタンス)をスレッドのクラスローダーに配置します。ユーザーのスレッドがJSFのFactoryFinderに到達するまで通常の方法で動作します。JSFは、ClassLoaderによってキーとしてキャッシュされます。 ClassLoaderが変更されたため、初期化できない新しいFactoryManagerが作成されます。これは、元のFactoryManagerが開始されたときに実装インスタンスリストが削除されるためです。そのため、実装クラスが見つからないため、IllegalStateExceptionがスローされます。

解決策:CXFのcreateClientの前に元のClassLoaderをバックアップし、URLClassLoaderを変数に保存して、元のClassLoaderをスレッドに戻します。 CXFから動的クラスにアクセスする場合は、変数に入れたURLClassLoaderを使用して検索します。

0