javax.faces.context.FacesContextFactory 使用 JSF 应用程序嵌入 Undertow 时出现异常

Posted

技术标签:

【中文标题】javax.faces.context.FacesContextFactory 使用 JSF 应用程序嵌入 Undertow 时出现异常【英文标题】:javax.faces.context.FacesContextFactory Exception while embedding Undertow with JSF application 【发布时间】:2017-07-27 16:43:43 【问题描述】:

我正在尝试使用嵌入式 Undertow 服务器构建一个简单的 JSF Web 应用程序。

项目的 Gradle 依赖项:

dependencies 

               compile group: 'io.undertow', name: 'undertow-core',    version: '1.4.0.CR3'
               compile group: 'io.undertow', name: 'undertow-servlet', version: '1.4.0.CR3'
               compile group: 'javax', name: 'javaee-api', version: '7.0'
               compile group: 'org.glassfish', name: 'javax.faces', version: '2.2.11'


Undertow 服务器代码示例:

public class HelloWorldServer 

    public static void main(final String[] args) throws ServletException 

        DeploymentInfo servletContainer=Servlets.deployment()
                .setClassLoader(HelloWorldServer.class.getClassLoader())
                .setDeploymentName("helloWorld.war")
                .setContextPath("")
                .addServlet(Servlets.servlet("javax.faces.webapp.FacesServlet",FacesServlet.class)
                .addMappings("/faces/*","/javax.faces.resource/*")
                .setLoadOnStartup(1));
        DeploymentManager manager=Servlets.defaultContainer().addDeployment(servletContainer);
        manager.deploy();
        HttpHandler servletHandler=manager.start();
        PathHandler path = Handlers.path(Handlers.redirect(""))
                    .addPrefixPath("/", servletHandler);

         Undertow server = Undertow.builder()
                    .addHttpListener(8080, "localhost")
                    .setHandler(path)
                    .build();
            server.start();

    

当我启动服务器时,出现以下错误:

Mar 07, 2017 6:04:49 PM javax.faces.FactoryFinder$FactoryManager copyInjectionProviderFromFacesContext
SEVERE: Unable to obtain InjectionProvider from init time FacesContext. Does this container implement the Mojarra Injection SPI?
Mar 07, 2017 6:04:49 PM javax.faces.FactoryFinder$FactoryManager getFactory
SEVERE: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory. Attempting to find backup.
Exception in thread "main" java.lang.IllegalStateException: Could not find backup for factory javax.faces.context.FacesContextFactory. 
    at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1135)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:350)
    at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117)
    at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:239)
    at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133)
    at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:541)
    at HelloWorldServer.main(HelloWorldServer.java:24)

【问题讨论】:

你确定你同时包含了 jsf api 和 impl 吗?或者也许(偶然)只有 api? 是的@Kukeltje。我正在使用glassfish jar,其中包括 api 和 impl。 发现一个针对 WildFly 服务器issues.jboss.org/browse/WFLY-6010的问题报告 接近“无法复制”, 是的。但就我而言,它抛出了同样的错误。 【参考方案1】:

终于找到了解决办法。

对于 JSF 引导过程,我们必须向 Undertow DeploymentInfo 类添加两个额外的 init 参数。

    com.sun.faces.forceLoadConfiguration = TRUE com.sun.faces.expressionFactory = com.sun.el.E​​xpressionFactoryImpl

此外,我们还必须添加两个除 JSF 之外的额外依赖项。

    el-api el-impl

【讨论】:

我有同样的问题,但是这些参数不能解决它。

以上是关于javax.faces.context.FacesContextFactory 使用 JSF 应用程序嵌入 Undertow 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章