Tomcat部署WAR后无法访问Jakarta EE控制器,报404错误求助
问题分析与解决办法
核心原因
Tomcat 是 Servlet 容器,默认不包含 Jakarta EE 的 JAX-RS(REST 规范)实现。你的代码使用了 JAX-RS 注解(@ApplicationPath、@Path、@GET),但 Tomcat 本身没有对应的处理类,导致请求无法被路由到控制器。另外还有几个次要可能:
- JAX-RS 相关依赖未被正确打包进 WAR 包
- 类路径扫描配置缺失,Tomcat 无法识别你的 JAX-RS 应用配置和控制器
具体解决步骤
1. 引入 JAX-RS 实现依赖(以 Jersey 为例)
在 pom.xml 中添加 Jersey(Jakarta EE 官方推荐的 JAX-RS 实现)的核心依赖,确保依赖会被打包进 WAR 包(不要设置为 provided 范围):
<dependencies> <!-- Jakarta REST API 规范 --> <dependency> <groupId>jakarta.ws.rs</groupId> <artifactId>jakarta.ws.rs-api</artifactId> <version>3.1.0</version> </dependency> <!-- Jersey 核心实现 --> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>3.1.5</version> </dependency> <dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-client</artifactId> <version>3.1.5</version> </dependency> <!-- Jersey 与 Servlet 集成 --> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-servlet-core</artifactId> <version>3.1.5</version> </dependency> <!-- 可选:自动扫描控制器类所需依赖 --> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>3.1.5</version> </dependency> </dependencies>
2. 确认依赖已打包进 WAR
执行 mvn compile war:war 后,解压生成的 myapp.war,检查 WEB-INF/lib 目录下是否包含上述 Jersey 和 JAX-RS 的 jar 包。如果缺失,检查 pom.xml 中依赖的 scope 是否被错误设为 provided,改为默认的 compile 即可。
3. 验证类扫描配置
你的 AppConfig 继承 Application 后,默认会扫描当前包及其子包下的 JAX-RS 注解类。如果控制器和配置类属于同一父包(com.example),理论上会被扫描到。如果仍不生效,可以显式指定要加载的控制器类:
package com.example.config; import jakarta.ws.rs.ApplicationPath; import jakarta.ws.rs.core.Application; import java.util.HashSet; import java.util.Set; import com.example.controller.BaseController; @ApplicationPath("/api") public class AppConfig extends Application { @Override public Set<Class<?>> getClasses() { Set<Class<?>> classes = new HashSet<>(); classes.add(BaseController.class); return classes; } }
4. 重启 Tomcat 测试
重新打包 WAR 包替换 Tomcat webapps 目录下的旧文件,重启 Tomcat 后访问 http://localhost:8080/myapp/api/hello,即可正常返回 "Hello World"。
内容的提问来源于stack exchange,提问作者stacktrace2234
相关产品推荐
相关产品推荐

