REST Web服务教程运行报404及jakarta.servlet.Filter类缺失问题求助
REST Web Services 部署问题解决方案
问题1:java.lang.ClassNotFoundException: jakarta.servlet.Filter 异常修复
该异常由Servlet API版本与REST实现、服务器版本不匹配导致:
- 根因:Jakarta EE 9 版本起将Servlet包命名空间从
javax.servlet变更为jakarta.servlet,如果你的REST依赖(如Jersey 3.x+)基于Jakarta EE规范,但部署用的服务器是Tomcat 9及更早版本(仅支持javax.servlet),就会出现类找不到错误;反之如果REST依赖是旧版javax系,部署到Tomcat 10+也会触发该异常。 - 修复步骤:
- 先匹配服务器与依赖版本:Tomcat 9及以下使用Jersey 2.x系列依赖(基于
javax.servlet),Tomcat 10及以上使用Jersey 3.x+系列依赖(基于jakarta.servlet) - 检查pom.xml依赖配置,确保对应版本的
servlet-api和jersey-container-servlet依赖引入正确,不要混用javax和jakarta前缀的包 - 不要直接移除web.xml配置,该文件是REST接口路径映射的核心配置,移除后必然出现404错误
- 先匹配服务器与依赖版本:Tomcat 9及以下使用Jersey 2.x系列依赖(基于
问题2:移除web.xml后接口返回404修复
移除web.xml后没有配置REST Servlet的映射规则,服务器无法识别你的资源类路径,按以下步骤修复:
- 恢复web.xml文件,添加Jersey Servlet配置,示例如下(适配
javax规范版本):
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>JerseyWebApp</servlet-name> <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> <init-param> <param-name>jersey.config.server.provider.packages</param-name> <param-value>替换为你自己的资源类所在包名,如com.yourname.messenger.resources</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JerseyWebApp</servlet-name> <url-pattern>/webapi/*</url-pattern> </servlet-mapping> </web-app>
- 检查你的资源类配置:
- 类上必须加
@Path("/myresource")注解 - 处理GET请求的方法必须加
@GET注解,返回值为字符串Gotit
- 类上必须加
- 检查部署配置:
- 确认项目打包生成的war包名为
messenger.war,否则访问路径的上下文根需要和war包名保持一致 - 确认Maven打包时将所有运行时依赖都打入
WEB-INF/lib目录,不要将Jersey相关依赖的scope设为provided,否则运行时会缺失类
- 确认项目打包生成的war包名为
内容的提问来源于stack exchange,提问作者Naresh
相关产品推荐
相关产品推荐

