WebSphere9部署Jersey3.0.2 REST服务报SRVE0201E非Servlet类错误如何解决
问题根因
本质为Java EE与Jakarta EE命名空间不兼容导致:
- WebSphere 9 遵循Java EE 8规范,内置Servlet API采用
javax.servlet.*命名空间 - Jersey 3.x 为Jakarta EE 9+适配版本,包括
ServletContainer在内的核心类均继承jakarta.servlet.*包下的HttpServlet,WebSphere 9无法识别该类为合法Servlet,因此抛出对应错误。
解决方案
优先选择方案1,适配成本最低:
方案1:降级Jersey到2.x稳定版本
Jersey 2.x版本仍遵循Java EE 8规范,使用javax命名空间,完全兼容WebSphere 9环境:
- 替换所有已导入的Jersey 3.x依赖包为统一版本的Jersey 2.x,建议选择2.39、2.41等官方维护的稳定2.x版本,必选依赖包包括:
jersey-commonjersey-serverjersey-container-servletjersey-media-json-jackson(用于JSON序列化,你的接口需要返回JSON所以必须添加)- 对应版本的
javax.ws.rs-api依赖
- 原有
web.xml配置无需修改,保持现有Servlet配置即可 - 检查REST POJO类的导入包,确保所有注解来自
javax.ws.rs包,示例正确导入如下:
import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType;
- 重新打包启动项目,访问
http://localhost:9080/CCFPortal/review/list即可正常调用接口。
方案2:升级容器适配Jersey 3.x
如果必须使用Jersey 3.x版本,需要将容器替换为支持Jakarta EE 9+的版本:
- 传统WebSphere 9不支持Jakarta EE规范,可更换为WebSphere Liberty 20.0.0.6及以上版本,开启Jakarta EE 9/10特性后即可兼容Jersey 3.x。
该方案需要调整容器配置,适配成本更高,无特殊需求不建议选择。
额外注意事项
- 手动导入依赖时务必保证所有Jersey相关包版本完全一致,避免版本冲突导致的类加载异常
- 若启动后仍报错可先清理WebSphere的临时缓存目录,再重新部署应用
内容的提问来源于stack exchange,提问作者Entropy
相关产品推荐
相关产品推荐

