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

迁移Jakarta后web.xml中HttpServletDispatcher及Spring监听器部署异常

迁移部署问题解决方案

一、核心问题根源

问题本质是javax与Jakarta命名空间的依赖冲突:

  • Resteasy 4.7.7.Final属于JakartaEE兼容版本,对应JakartaEE9+分支,而Spring 5.3.30仅支持javax命名空间,Spring6才支持Jakarta。
  • WildFly27是JakartaEE9.1容器,JBoss19是JavaEE8容器,两者对Servlet/Listener接口的命名空间要求不同,导致依赖不兼容。

二、针对性解决方案

方案1:调整Resteasy版本适配Spring 5.3(javax命名空间)

若继续使用Spring5.3.x(javax),需降级Resteasy到兼容JavaEE8的版本:

  • 替换Resteasy核心依赖为3.19.x.Final版本,这是JavaEE8兼容的最后一批Resteasy版本:
    <!-- 核心依赖 -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-jaxrs</artifactId>
        <version>3.19.1.Final</version>
        <scope>provided</scope> <!-- WildFly/JBoss自带Resteasy,设为provided避免冲突 -->
    </dependency>
    <!-- Spring集成依赖 -->
    <dependency>
        <groupId>org.jboss.resteasy</groupId>
        <artifactId>resteasy-spring</artifactId>
        <version>3.19.1.Final</version>
        <exclusions>
            <!-- 排除自带Spring依赖,避免和项目Spring5.3冲突 -->
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.springframework</groupId>
                <artifactId>spring-web</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  • 修正web.xml中的Listener和Servlet类,确保使用javax命名空间实现:
    <listener>
        <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Resteasy</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
    </servlet>
    
  • 部署验证:
    • JBoss19(JavaEE8)直接部署即可,版本完全匹配;
    • WildFly27需在jboss-deployment-structure.xml中排除自带Jakarta版本Resteasy,引入javax版本模块:
      <jboss-deployment-structure>
          <deployment>
              <exclude-subsystems>
                  <subsystem name="resteasy"/>
              </exclude-subsystems>
              <dependencies>
                  <module name="org.jboss.resteasy.resteasy-jaxrs" slot="javax" />
                  <module name="org.jboss.resteasy.resteasy-spring" slot="javax" />
              </dependencies>
          </deployment>
      </jboss-deployment-structure>
      

方案2:升级Spring到6.x版本适配Jakarta命名空间

若保留Resteasy4.7.7(Jakarta),需升级Spring到6.0.x及以上版本,Spring6开始支持Jakarta命名空间:

  • 升级Spring核心依赖到6.0.x(例如6.0.11),确保所有Spring相关依赖(spring-web、spring-context等)版本统一;
  • 替换所有javax命名空间代码为jakarta:
    例如javax.servlet.Servlet改为jakarta.servlet.Servlet,javax.ws.rs.*改为jakarta.ws.rs.*;
  • 修正web.xml为JakartaEE格式:
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app 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_5_0.xsd"
             version="5.0">
        <listener>
            <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
        </listener>
        <servlet>
            <servlet-name>Resteasy</servlet-name>
            <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
        </servlet>
    </web-app>
    
  • 部署验证:
    • WildFly27直接部署即可,完美兼容JakartaEE9.1;
    • JBoss19不支持JakartaEE,若要兼容需放弃JBoss19,或保持双分支维护。

方案3:双分支维护(兼容不同容器)

若需同时支持JBoss19(JavaEE8)和WildFly27(JakartaEE9),建议维护两个分支:

  • 分支1:Spring5.3 + Resteasy3.19.x,适配JBoss19;
  • 分支2:Spring6.x + Resteasy4.7.7,适配WildFly27。

三、IntelliJ提示的解决

IntelliJ的提示源于项目同时存在javax和Jakarta的Servlet API依赖,解决上述依赖冲突后提示会自动消失。也可手动调整项目SDK依赖:

  • 方案1:设置项目SDK为Java8,仅引入javax.servlet-api;
  • 方案2:设置项目SDK为Java17+(Spring6要求Java17),引入jakarta.servlet-api。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 19:17:03