使用STS开发Spring项目遇Resin3.1兼容问题,如何升级Servlet2.5至3.0?
解决Resin 3.1下Servlet 3.0方法缺失的问题
你遇到的这个java.lang.NoSuchMethodError很典型——Resin 3.1确实只支持Servlet 2.5规范,而HttpServletResponse.getStatus()是Servlet 3.0才新增的方法。要解决这个问题,有两个清晰的方向可以选,我给你详细拆解:
方案一:升级Resin到支持Servlet 3.0的版本
这是最省心的方案,因为Resin从4.x版本开始原生支持Servlet 3.0规范(后续还支持3.1、4.0)。步骤很简单:
- 下载Resin 4.x或更高版本的稳定包(比如4.0.68)
- 在STS中打开
Window > Preferences > Server > Runtime Environments,删除旧的Resin 3.1运行时,添加新下载的Resin 4.x版本 - 把你的项目重新关联到新的Resin运行时,重新部署即可
升级后不仅能解决这个方法缺失的问题,还能用上Servlet 3.0的异步处理、注解式Servlet等特性,长远来看更划算。
方案二:调整项目兼容Servlet 2.5(不升级Resin)
如果因为某些原因必须保留Resin 3.1,那就要让项目退回到Servlet 2.5的规范上:
替换/移除依赖Servlet 3.0的代码
- 如果是你自己的代码调用了
getStatus(),可以换成Servlet 2.5的替代方式:比如在设置状态码时用request.setAttribute记录状态值,后续需要获取时直接从属性中读取; - 如果是Spring框架内部触发的这个错误,你需要降级Spring版本到兼容Servlet 2.5的分支:比如Spring 3.2.x(这是最后一个稳定支持Servlet 2.5的Spring大版本),Spring 4.x及以上默认依赖Servlet 3.0 API,会触发此类兼容性问题。
- 如果是你自己的代码调用了
修正项目依赖配置
- 如果你用Maven/Gradle,确保
servlet-api依赖是2.5版本,并且设置为provided(避免和Resin自带的Servlet API冲突):
Maven示例:
Gradle示例:<dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> <scope>provided</scope> </dependency>providedCompile 'javax.servlet:servlet-api:2.5' - 手动排除项目中其他依赖引入的Servlet 3.0 API(比如部分Spring衍生依赖可能会偷偷带入高版本Servlet包)。
- 如果你用Maven/Gradle,确保
调整STS项目Facet设置
- 在STS中右键项目,选择
Properties > Project Facets,找到Dynamic Web Module,把版本改成2.5,同步项目配置以消除IDE的兼容性提示。
- 在STS中右键项目,选择
总结
优先推荐方案一,升级Resin是一劳永逸的解决方式;如果实在不能升级,就按方案二调整项目代码和依赖,确保完全兼容Servlet 2.5规范。
内容的提问来源于stack exchange,提问作者Bard
相关产品推荐
相关产品推荐

