javax.faces.context.FacesContextFactory 将 Undertow 嵌入 JSF 应用程序时出现异常
javax.faces.context.FacesContextFactory Exception while embedding Undertow with JSF application
我正在尝试使用嵌入式 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 bootstrap 进程,我们必须向 Undertow DeploymentInfo 添加两个额外的初始化参数 class。
- com.sun.faces.forceLoadConfiguration = 真
- com.sun.faces.expressionFactory = com.sun.el.ExpressionFactoryImpl
此外,除了 JSF,我们还必须添加两个额外的依赖项。
- el-api
- el-impl
我正在尝试使用嵌入式 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 bootstrap 进程,我们必须向 Undertow DeploymentInfo 添加两个额外的初始化参数 class。
- com.sun.faces.forceLoadConfiguration = 真
- com.sun.faces.expressionFactory = com.sun.el.ExpressionFactoryImpl
此外,除了 JSF,我们还必须添加两个额外的依赖项。
- el-api
- el-impl