MyFaces 1.2 的应用程序错误:java.lang.IllegalStateException:没有为此应用程序配置工厂

Posted

技术标签:

【中文标题】MyFaces 1.2 的应用程序错误:java.lang.IllegalStateException:没有为此应用程序配置工厂【英文标题】:Application error with MyFaces 1.2: java.lang.IllegalStateException: No Factories configured for this Application 【发布时间】:2011-09-20 04:11:09 【问题描述】:

对于我的应用,我使用 Tomcat 6.0.xMojarra 1.2_04 JSF 实现。 它工作正常,只是我现在想切换到 JSF 的 MyFaces 1.2_10 impl。

在我的应用程序部署期间,出现以下错误:

ERROR [org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/myApp]] StandardWrapper.Throwable
java.lang.IllegalStateException: No Factories configured for this Application. This happens if the faces-initialization does not work at all - make sure that you properly include all configuration settings necessary for a basic faces application and that all the necessary libs are included. Also check the logging output of your web application and your container for any exceptions!
If you did that and find nothing, the mistake might be due to the fact that you use some special web-containers which do not support registering context-listeners via TLD files and a context listener is not setup in your web.xml.
A typical config looks like this;
<listener>
  <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>

    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:106)
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:137)
    at org.apache.myfaces.webapp.MyFacesServlet.init(MyFacesServlet.java:113)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1172)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:992)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4058)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4371)
...

这是我的 web.xml 配置的一部分:

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <!-- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> -->
        <servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    ...
    <listener>
         <listener- class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
    </listener>

有没有人遇到过类似的错误,我应该怎么做才能修复它?谢谢!

编辑:

我能够解决问题。由于我使用 FacesServlet 的委托人,结果证明是这个委托人导致了问题。 我需要做的就是让这个类实现DelegatedFacesServlet,并且我已经删除了org.apache.myfaces.webapp.StartupServletContextListener。这是我现在的 web.xml:

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <!-- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> -->
        <servlet-class>org.apache.myfaces.webapp.MyFacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet>
        <servlet-name>Faces Servlet Delegator</servlet-name>
        <servlet-class>com.myapp.web.FacesServletDelegator</servlet-class>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet Delegator</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>

这里是 FacesServletDelegator

public class PLMFacesServlet extends HttpServlet implements DelegatedFacesServlet 

    private MyFacesServlet delegate;

    public final void init(ServletConfig servletConfig) throws ServletException 
        delegate = new MyFacesServlet();
        delegate.init(servletConfig);
    

    public final void destroy() 
        delegate.destroy();
    

    public final ServletConfig getServletConfig() 
        return delegate.getServletConfig();
    

    public final String getServletInfo() 
        return delegate.getServletInfo();
    

    public final void service(HttpServletRequest request, HttpServletResponse response) throws ServletException 

       try 
           delegate.service(request, response);
        catch(Exception e) 
    
    // some other code...

编辑 2

根据 BalusC 的建议,我稍微编辑了我的 web.xml,这是最终版本:

<servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet>
    <servlet-name>Faces Servlet Delegator</servlet-name>
    <servlet-class>com.myapp.web.FacesServletDelegator</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet Delegator</servlet-name>
    <url-pattern>*.jsf</url-pattern>
</servlet-mapping>

【问题讨论】:

我不使用 MyFaces,但事实上我非常惊讶于您显然需要排除指定的 JSF 2.0 API &lt;servlet-class&gt;javax.faces.webapp.FacesServlet&lt;/servlet-class&gt; 并使用 MyFaces 特定的 API。这意味着 MyFaces 与 JSF 2.0 API 不兼容。还是这只是你的无知?撤消该结果并摆脱 MyFaces impl 特定声明并重试。有用吗? 它正在工作。感谢 BalusC 指出这一点。当我搜索可能是最初问题的原因时,我可能也进行了此更改。我会按照您的建议编辑我的问题... 只是为了回复之前的评论并说明清楚,MyFaces Core 与 JSF 2.0 API 100% 兼容,因为在每次发布之前进行的一些测试都会检查这一点。覆盖默认的标准 FacesServlet 并使用一个特定于实现的委托,这意味着它是规范“外部”的 hack。有一些有效的用例可以做到这一点,但作为“最佳实践”,您不应该依赖它。如果您有更多关于 MyFaces 的问题,您还可以在MyFaces users and dev mailing lists 上提问 【参考方案1】:

就我而言,从我的 web.xml 中删除以下行:

<load-on-startup>1</load-on-startup>

...是什么让错误消失了。

(正在修复纯 Tomcat 7 以使用 JSF。)

【讨论】:

以上是关于MyFaces 1.2 的应用程序错误:java.lang.IllegalStateException:没有为此应用程序配置工厂的主要内容,如果未能解决你的问题,请参考以下文章

从 WAS8 迁移到 WAS9 时遇到 myFaces 错误?

优化:Myfaces:NUMBER_OF_VIEWS_IN_SESSION

使用捆绑在 webapp 中并在 Wildfly 上运行的 myfaces 时未调用 CDI Bean 方法

Mojarra 和 MyFaces 之间的区别

需要使用 myfaces 1.1 针对 Wildfly 10 反序列化不受信任数据的示例代码

有没有办法修复损坏的 myfaces 验证码图像?