Wildfly 30部署JSF Web应用时遇Deployment为空异常求助
Wildfly 30部署JSF+PrettyFaces应用失败:NullPointerException异常排查
我正在部署一个基于JSF框架、用PrettyFaces(pretty-config)实现URL重写的Web应用,但在Wildfly 30上部署失败,抛出NullPointerException。
服务器堆栈跟踪信息
15:49:42,528 INFO [org.jboss.as.repository] (DeploymentScanner-threads - 1) WFLYDR0001: Content added at location /home/cazauxj/soft/Wildfly/wildfly-30.0.0.Final/standalone/data/content/38/b6457d0fb37e37f344353750e22c157cedcfb0/content 15:49:42,561 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 100) WFLYJPA0011: Stopping Persistence Unit (phase 2 of 2) Service 'web-0.0.1-SNAPSHOT.war#FarscapePU' 15:49:42,564 INFO [org.hibernate.orm.beans] (ServerService Thread Pool -- 100) HHH10005004: Stopping BeanContainer : org.hibernate.resource.beans.container.internal.CdiBeanContainerExtendedAccessImpl@ea97e10 15:49:42,566 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 100) WFLYJPA0011: Stopping Persistence Unit (phase 1 of 2) Service 'web-0.0.1-SNAPSHOT.war#FarscapePU' 15:49:42,917 INFO [org.jboss.as.server.deployment] (MSC service thread 1-8) WFLYSRV0028: Stopped deployment web-0.0.1-SNAPSHOT.war (runtime-name: web-0.0.1-SNAPSHOT.war) in 386ms 15:49:42,921 INFO [org.jboss.as.server.deployment] (MSC service thread 1-8) WFLYSRV0027: Starting deployment of "web-0.0.1-SNAPSHOT.war" (runtime-name: "web-0.0.1-SNAPSHOT.war") 15:49:44,856 INFO [org.jboss.as.jpa] (MSC service thread 1-5) WFLYJPA0002: Read persistence.xml for FarscapePU 15:49:44,972 INFO [org.jipijapa] (MSC service thread 1-3) JIPIORMV6020260: Second level cache enabled for web-0.0.1-SNAPSHOT.war#FarscapePU 15:49:44,983 INFO [org.jboss.weld.deployer] (MSC service thread 1-5) WFLYWELD0003: Processing weld deployment web-0.0.1-SNAPSHOT.war 15:49:44,991 INFO [org.infinispan.CONTAINER] (ServerService Thread Pool -- 100) ISPN000556: Starting user marshaller 'org.wildfly.clustering.infinispan.marshalling.jboss.JBossMarshaller' 15:49:45,030 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 100) WFLYJPA0010: Starting Persistence Unit (phase 1 of 2) Service 'web-0.0.1-SNAPSHOT.war#FarscapePU' 15:49:45,030 INFO [org.hibernate.jpa.internal.util.LogHelper] (ServerService Thread Pool -- 100) HHH000204: Processing PersistenceUnitInfo [name: FarscapePU] 15:49:45,049 INFO [org.jipijapa] (MSC service thread 1-6) JIPIORMV6020260: Second level cache enabled for web-0.0.1-SNAPSHOT.war#FarscapePU 15:49:45,050 WARN [org.hibernate.orm.deprecation] (ServerService Thread Pool -- 100) HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default) 15:49:45,055 INFO [org.hibernate.envers.boot.internal.EnversServiceImpl] (ServerService Thread Pool -- 100) Envers integration enabled? : true 15:49:45,096 INFO [org.jboss.as.jpa] (ServerService Thread Pool -- 100) WFLYJPA0010: Starting Persistence Unit (phase 2 of 2) Service 'web-0.0.1-SNAPSHOT.war#FarscapePU' 15:49:45,274 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 102) MSC000001: Failed to start service jboss.deployment.unit."web-0.0.1-SNAPSHOT.war".undertow-deployment: org.jboss.msc.service.StartException in service jboss.deployment.unit."web-0.0.1-SNAPSHOT.war".undertow-deployment: java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke "io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)" because "this.deployment" is null at org.wildfly.extension.undertow@30.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:73) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486) at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377) at java.base/java.lang.Thread.run(Thread.java:833) at org.jboss.threads@2.4.0.Final//org.jboss.threads.JBossThread.run(JBossThread.java:513) Caused by: java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke "io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)" because "this.deployment" is null at io.undertow.servlet@2.3.10.Final//io.undertow.servlet.core.DeploymentManagerImpl.undeploy(DeploymentManagerImpl.java:690) at org.wildfly.extension.undertow@30.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:93) at org.wildfly.extension.undertow@30.0.0.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:70) ... 8 more Caused by: java.lang.NullPointerException: Cannot invoke "io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)" because "this.deployment" is null at io.undertow.servlet@2.3.10.Final//io.undertow.servlet.core.DeploymentManagerImpl.undeploy(DeploymentManagerImpl.java:673) ... 10 more 15:49:45,274 ERROR [org.jboss.as.controller.management-operation] (DeploymentScanner-threads - 1) WFLYCTL0013: Operation ("full-replace-deployment") failed - address: ([]) - failure description: {"WFLYCTL0080: Failed services" => {"jboss.deployment.unit.\"web-0.0.1-SNAPSHOT.war\".undertow-deployment" => "java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke \"io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)\" because \"this.deployment\" is null Caused by: java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke \"io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)\" because \"this.deployment\" is null Caused by: java.lang.NullPointerException: Cannot invoke \"io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)\" because \"this.deployment\" is null"}} 15:49:45,289 INFO [org.jboss.as.server] (DeploymentScanner-threads - 1) WFLYSRV0016: Replaced deployment "web-0.0.1-SNAPSHOT.war" with deployment "web-0.0.1-SNAPSHOT.war" 15:49:45,290 INFO [org.jboss.as.controller] (DeploymentScanner-threads - 1) WFLYCTL0183: Service status report WFLYCTL0186: Services which failed to start: service jboss.deployment.unit."web-0.0.1-SNAPSHOT.war".undertow-deployment: java.lang.RuntimeException: java.lang.NullPointerException: Cannot invoke "io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(io.undertow.servlet.api.ThreadSetupHandler$Action)" because "this.deployment" is null 15:49:45,303 INFO [org.jboss.as.repository] (DeploymentScanner-threads - 1) WFLYDR0002: Content removed from location /home/cazauxj/soft/Wildfly/wildfly-30.0.0.Final/standalone/data/content/83/f15bfe4aad1e2b017cf4d38dbfb26f531fdf05/content
web.xml配置
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!--Pretty faces conf --> <!-- <filter> <filter-name>PrettyFilter</filter-name> <filter-class>com.ocpsoft.pretty.PrettyFilter</filter-class> </filter> --> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> <context-param> <param-name>jakarta.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.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> <session-config> <session-timeout>30</session-timeout> </session-config> <welcome-file-list> <welcome-file>faces/pages/index.xhtml</welcome-file> </welcome-file-list> </web-app>
pretty-config配置文件
<prety-config xmlns="http://ocpsoft.org/schema/rewrite-config-prettyfaces" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://ocpsoft.org/schema/rewrite-config-prettyfaces http://ocpsoft.org/xml/ns/prettyfaces/rewrite-config-prettyfaces.xsd"> <!-- Begin RewriteRules --> <rewrite match="/faces/pages/.*" trailingSlash="append" toCase="lowercase" /> <rewrite match="^/old-url/(\w+)/$" substitute="/new_url/$1/" redirect="301" /> <url-mapping id="home"> <pattern value="/" /> <view-id>/faces/pages/index.xhtml</view-id> </url-mapping> <url-mapping id="guideEpisode"> <pattern value="/guide-episodes/" /> <view-id>/faces/pages/guideEpisode.xhtml</view-id> </url-mapping> <url-mapping id="intro"> <pattern value="/introduction" /> <view-id>/faces/pages/introduction.xhtml</view-id> </url-mapping> <url-mapping id="saisons"> <pattern value="/saisons" /> <view-id>/faces/pages/saisons.xhtml</view-id> </url-mapping> <url-mapping id="episode"> <pattern value="/episode/" /> <view-id>/faces/pages/episode.xhtml</view-id> </url-mapping> </pretty-config>
问题原因与修复方案
核心原因
异常Cannot invoke "io.undertow.servlet.core.DeploymentImpl.createThreadSetupAction(...)" because "this.deployment" is null本质是旧版PrettyFaces与Wildfly 30的Jakarta EE 10环境不兼容。Wildfly 30基于Jakarta EE 10,使用jakarta.*命名空间,而旧版PrettyFaces依赖javax.*命名空间的API,无法适配新环境,导致部署时初始化流程异常。
修复步骤
升级URL重写依赖到Jakarta兼容版本
放弃旧版PrettyFaces,使用其继任项目Rewrite的Jakarta兼容版本(5.0.0.Final及以上),该版本已完全迁移到Jakarta命名空间。修正web.xml配置
- 移除注释的
PrettyFilter配置:新版Rewrite会自动注册过滤器,无需手动配置。 - 更新web.xml的版本和命名空间到Jakarta EE 10标准:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="6.0" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"> <!-- 原有其他配置保持不变 --> </web-app>
- 移除注释的
更新pretty-config.xml的命名空间
修正配置文件的XML命名空间为Rewrite的Jakarta版本:<pretty-config xmlns="https://ocpsoft.org/schema/rewrite-config-prettyfaces" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://ocpsoft.org/schema/rewrite-config-prettyfaces https://ocpsoft.org/xml/ns/prettyfaces/rewrite-config-prettyfaces.xsd"> <!-- 原有映射规则保持不变 --> </pretty-config>清理并重新部署
- 删除Wildfly
standalone/data/content目录下的旧部署内容 - 重新打包应用,确保所有依赖(如JSF、Spring Security)均为Jakarta兼容版本
- 重新部署到Wildfly 30
- 删除Wildfly
额外注意事项
- 检查项目所有依赖,确保从
javax.*完全迁移到jakarta.*命名空间,例如JSF依赖使用jakarta.faces:jakarta.faces-api:4.0.0及以上版本 - 避免引入重复的
javax版本依赖,防止类加载冲突
内容的提问来源于stack exchange,提问作者lapin
相关产品推荐
相关产品推荐

