使用@WebServlet注解配置Servlet后访问接口出现404问题求助
问题根因
- 核心不兼容问题:Tomcat 10.0.x及以上版本实现的是Jakarta EE 9规范,Servlet相关API的包名从原先的
javax.servlet.*全面调整为jakarta.servlet.*。你当前使用的javax.servlet-api4.0.1属于旧的Java EE规范,Tomcat 10不会扫描识别javax.servlet.annotation.WebServlet注解,导致Servlet没有被注册,访问时返回404。 - 其他可能的配置问题:若IDEA中Tomcat部署的应用上下文路径不为
/,也会导致直接访问/user路径404。
可行解决方案
方案1:降级Tomcat版本(改造成本最低)
直接使用Tomcat 9.x版本,该版本仍兼容Java EE规范的javax.servlet包,无需修改现有代码和依赖配置,替换Tomcat版本后重新部署即可正常访问。
方案2:适配Tomcat 10的Jakarta EE规范
- 替换Servlet依赖为Jakarta版本,
pom.xml中修改依赖配置如下:
<dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>5.0.0</version> <scope>provided</scope> </dependency>
- 修改
UserServlet类的所有导入包,将javax.servlet替换为jakarta.servlet:
package yj.servlet; import jakarta.servlet.ServletException; import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(urlPatterns = {"/user"}) public class UserServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("来了个get请求"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("来了个post请求"); doGet(req, resp); } }
- 重新构建项目并部署即可。
额外排查点
检查IDEA Tomcat配置的Deployment标签页中,Application context配置项:
- 若配置为
/,访问地址为http://localhost:8089/user - 若配置为其他值(如
/myweb),访问地址需拼接上下文路径,即http://localhost:8089/myweb/user
内容的提问来源于stack exchange,提问作者CsJuniorInNuist
相关产品推荐
相关产品推荐

