升级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
相关产品推荐
相关产品推荐

