You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 06:05:04