You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,无法适配新环境,导致部署时初始化流程异常。

修复步骤

  1. 升级URL重写依赖到Jakarta兼容版本
    放弃旧版PrettyFaces,使用其继任项目Rewrite的Jakarta兼容版本(5.0.0.Final及以上),该版本已完全迁移到Jakarta命名空间。

  2. 修正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>
      
  3. 更新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>
    
  4. 清理并重新部署

    • 删除Wildfly standalone/data/content目录下的旧部署内容
    • 重新打包应用,确保所有依赖(如JSF、Spring Security)均为Jakarta兼容版本
    • 重新部署到Wildfly 30

额外注意事项

  • 检查项目所有依赖,确保从javax.*完全迁移到jakarta.*命名空间,例如JSF依赖使用jakarta.faces:jakarta.faces-api:4.0.0及以上版本
  • 避免引入重复的javax版本依赖,防止类加载冲突

内容的提问来源于stack exchange,提问作者lapin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:21:46