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

升级Spring Boot 2.4.13部署WebSphere8.5.5遇NoSuchMethodError求助

解决方案

问题根源

WebSphere 8.5.5自带Servlet 3.0规范的API,而Spring Boot 2.4.13依赖的Spring Web 5.3.20会调用Servlet 3.1新增的HttpServletResponse.setContentLengthLong(J)V方法。同时WebSphere默认类加载策略是优先加载父类加载器(服务器端)的Jar包,导致你引入的Servlet 3.1 API被忽略,出现NoSuchMethodError。

可行解决方案

1. 调整WebSphere类加载顺序(优先加载应用本地类)

  • 登录WebSphere管理控制台,定位到你的应用
  • 进入类加载和更新检测配置页面
  • 将类加载顺序设置为「类加载器的本地类先于父类加载器加载」(即PARENT_LAST模式)
  • 重启应用,此时应用会优先加载自身WEB-INF/lib中的Servlet 3.1 API,避免调用服务器端缺失的方法
  • 注意:该模式可能引发其他依赖冲突(如应用与WebSphere自带的其他API版本不一致),需提前测试验证。

2. 强制打包Servlet 3.1 API并排除Spring Boot默认依赖

修改pom.xml,确保Spring Boot不会引入默认的Servlet API,同时将指定的3.1.0版本打包进应用:

<!-- 排除spring-boot-starter-web自带的Servlet API依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<!-- 显式引入Servlet 3.1 API,设置为compile确保打包到应用 -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>compile</scope>
</dependency>

配合上述PARENT_LAST类加载策略使用,确保应用优先加载本地的Servlet API。

3. 降级Spring Boot到兼容Servlet 3.0的版本

Spring Boot 2.3.x系列支持Servlet 3.0规范,与WebSphere 8.5.5完全兼容,无需调整类加载策略:

  • 将pom.xml中的spring-boot-starter-parent版本改为2.3.12.RELEASE(2.3.x系列的最后一个稳定版)
  • 对应的Spring Web版本会自动适配为5.2.15.RELEASE,该版本不会调用Servlet 3.1的专属方法,可直接正常部署

方案选择建议

  • 若需保留Spring Boot 2.4.x的新特性,优先尝试方案1+方案2,注意测试依赖冲突
  • 若追求稳定性与兼容性,方案3是最稳妥的选择,无需额外配置类加载策略

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:15:41